进程间通信---管道和消息队列

本文介绍了进程间通信的两种方式——管道和消息队列。管道包括匿名管道,特点是read和write调用可能会阻塞。消息队列则允许按消息类型接收,且能指定优先级。通过ftok函数生成key确保进程访问同一消息队列。文中还给出了消息队列相关函数的使用示例及注意事项。
摘要由CSDN通过智能技术生成
进程间通信的目的:
数据传输:一个进程需要将它的数据发送给另一个进程
资源共享:对个进程之间共享同样的资源
通知事件:一个进程需要向另一个或一组进程发送消息,通知它们发生了什么事件
进程控制:有些进程希望完全控制另一个进程的执行(如:Debug进程)

进程间通信的发展:
管道:
System V进程间通信:
POSIX进程间通信:

进程间通信的分类:

管道:
我们把从一个进程连接到另一个进程的一个数据流称为一个“管道”,管道是Unix中最古老的进程间通信的方式。

  • 匿名管道:
函数原型:
int pipe(int fd[2]);
参数说明:
fd:文件描述符数组,fd[0]表示读端,fd[1]表示写端
返回值:成功返回0,失败返回错误代码。

图解:

举一个例子:从键盘读取数据,写入管道,读取管道,写到屏幕。



管道读写规则:
当没有数据可读时:
  • read调用阻塞,即进程暂停执行,一直等到有数据来到为止,read调用返回-1,errno值为EAGAIN
当管道满的时候:
  • write调用阻塞,直到有进程读走数据,调用返回-1,errno值为EAGAIN。
如果所有管道写端对应的文件描述符被关闭,则read返回0
如果所有管道读端对应的文件描述符被关闭,则write操作会产生信号SIGIPE,进而可能导致write进程退出。
当要写入的数据量不大于PIPE_BUF时,Linux将保证写入的原子性
当要写入的数据量大于PIPE_BUF时,Linux将不再保证写入的原子性

管道特点:
只能用于具有共同祖先的进程(具有亲缘关系的进程)之间进行通信。比如,一个管道由一个进程创建,然后该进程调用fork,此后父、子进程之间就可以应用该管道。
管道提供流式服务
进程退出,管道释放,所以管道的生命周期随进程。
内核会对管道操作进行同步与互斥
  • 2
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值