Linux

    xiaoxiao2022-07-05  215

    进程间通信是指在不同进程之间传播或交换信息 进程间通信可分为以下几类

    管道(匿名管道和命名管道) 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语义相同。

    最新回复(0)