Linux_linux进程间通信

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

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值