进程间通信是指在不同进程之间传播或交换信息 进程间通信可分为以下几类
管道(匿名管道和命名管道) system IPC 消息队列(用于数据传输) 共享内存(用于数据共享) 信号量(用于事件通知) POSIX IPC 消息队列 共享内存 互斥量 条件变量 信号量 读写锁 主要介绍常用的如管道、消息队列、信号量、共享内存这几个。
一、管道 管道通常指匿名管道,它也是Unix系统最古老的IPC形式。
1、特点: 它是半双工的(即数据只能在一个方向上流动),具有固定的读端和写端。
它只能用于具有亲缘关系的进程之间的通信(也是父子进程或者兄弟进程之间)。
它可以看成是一种特殊的文件,对于它的读写也可以使用普通的read、write 等函数。但是它不是普通的文件,并不属于其他任何文件系统,并且只存在于内存中。
2、创建管道 创建匿名管道 函数原型:
#include<unistd.h> int pipe(int pipefd[2]);参数: pipefd[2]:文件描述符数组,fd[0]表示读端,fd[1]表示写端 返回值: 成功返回0,失败返回错误代码
要关闭管道关闭这两个文件描述符即可。
创建命名管道 函数原型 int mkfifo( const char* name, mode_t mode) 1 如mkfifo my.p (mkfifo创建普通文件) mode为权限 当 open 一个FIFO时,是否设置非阻塞标志(O_NONBLOCK)的区别: 1.若没有指定O_NONBLOCK(默认),只读 open 要阻塞到某个其他进程为写而打开此 FIFO。类似的,只写 open 要阻塞到某个其他进程为读而打开它。 2.若指定了O_NONBLOCK,则只读 open 立即返回。而只写 open 将出错返回 -1 如果没有进程已经为读而打开该 FIFO,其errno置ENXIO。
等于用一个名字代表内存空间
3、打开管道文件
int fd = open( name, O_RDONLY); //读 int fd = open( name, O_WRONLY); //写4、匿名管道和命名管道的区别 匿名管道由pipe函数创建并打开 命名管道由mkfifo函数创建,用open打开 创建成功后,FIFO和pipe语义相同。
