Linux进程间的通信
进程间的通信有管道、信号、消息队列、信号量、共享内存、套接字等。
一、管道通信
管道通信方式分为无名管道和有名管道,无名通道可用于有亲缘关系进程间的通信,有名通道克服了管道没有名字的限制。
管道具有以下特点:
1.管道是半双工的,数据只能向一个方向流动;需要双方通信时,需要建立两个管道。
2.只能由于父子进程或者兄弟进程之间
3.单独过程一种独立的文件系统
4.数据的读出和写入:一个进程向管道中写的内容被管道另一端的进程读出。写入的内容每次都添加在 管道缓冲区的末尾,并且每次都是从缓冲区头部读出数据。
相关函数 |
mkfifo、popen、read、write、fork |
---|---|
表头文件 |
#include<unistd.h> |
定义函数 |
int pipe(int filedes[2]) |
函数说明 |
pipe()会建立管道,并将文件描述由参数fileds数组返回。filedes[0]为管道的读取端,filedes[1]则为管道的写入端。 |
返回值 |
若成功则返回0,否则返回-1;,错误原因在errno中 |
错误代码 |
EMFILE:进程已用文件描述符最大量 ENFILE:系统已无文件描述符可用 EFAULT:参数filedes数组地址不合法 |
- EMFILE:进程已用文件描述符最大量
- ENFILE:系统已无文件描述符可用
- EFAULT:参数filedes数组地址不合法
#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>
int main()
{
int filedes[2];
char buffer[80];
pipe(filedes);
if(fork()>0)
{
/*父进程*/
char s[] = "hello!n";
write(filedes[1],s,sizeof(s));
}
else
{
/*子进程*/
read(filedes[0],buffer,80);
printf("%s",buffer);
}
}
读写无名管道
二、信号量
信号量是一个计数器,可以用来控制多个进程对共享资源的访问,常作为一种锁机制,防止某进程正在访问共享资源时,其他进程也访问该资源。因此,主要作为进程间以及同一进程内不同线程之间的同步手段。
为了防止出现因多个程序同时访问一个共享资源而引发的一系列问题,在任一时刻只能有一个执行线程访问代码的临界区域,临界区域是指执行数据更新的代码需要独占式的执行,而信号量则可以提供这种访问机制,让临界区同一事件只有一个线程在访问。
三、消息队列
消息队列(message queue)
消息队列是由消息的链表,存放在内核中并有消息队列标识符的标识。克服了信号量传递信息少、管道只能承载无格式字节流以及缓冲区大小受限等缺点。
四、信号
信号是一种比较复杂的通信方式,用来通知接收进程某个事件已经发生。
五、
共享内存(shared memory)
映射一段能被其他进程所访问的内存,这段共享内存由一个进程创建,但多个进程都可以访问。是最快的IPC(进程间通信)方式,是针对其他进程间通信方式运行效率低而专门设计的,往往与信号量配合使用,实现进程间的同步和通信。
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法