深入理解Linux进程间通信IPC -- 管道,共享内存,消息队列,信号量

进程间通信

每个进程都有自己独立的虚拟地址内存空间,因此不同的进程具有独立性,一般情况下,是不会互相影响的。但是不同进程经常需要进行数据传输或者数据共享等一些操作。
于是便引出了进程间通信IPC这个概念。

进程间通信的作用和目的:

  1. 数据传输:一个进程需要将它的数据发送给另一个进程,发送的数据量在一个字节到几兆字节之间。

  2. 共享数据:多个进程想要操作共享数据,一个进程对共享数据的修改,别的进程应该立刻看到。

  3. 通知事件:一个进程需要向另一个或一组进程发送消息,通知它(它们)发生了某种事件(如进程终止时要通知父进程)。

  4. 资源共享:多个进程之间共享同样的资源。为了作到这一点,需要内核提供锁和同步机制。

  5. 进程控制:有些进程希望完全控制另一个进程的执行(如Debug进程),此时控制进程希望能够拦截另一个进程的所有陷入和异常,并能够及时知道它的状态改变。

IPC方式有以下几种:
管道 – 匿名管道,命名管道、系统IPC – 信号量、消息队列、共享内存 和套接字。
其中管道和消息队列主要用于数据传输,共享内存主要用于数据共享,信号量用于进程控制方面的一些操作。
本片文章对管道,共享内存,消息队列和信号量进行剖析。套接字在本人的网络部分文章中进行说明。

管道

操作系统分为内核态和用户态,管道就是在内核中开辟一块缓冲区,不同的进程通过对这个缓冲取进行读写操作实现IPC。

管道其实有三种不同的形式,

  • 匿名管道,半双工通信,只能在父子或者兄弟进程间使用.,
  • 命令流管道s_pipe: 全双工。父子兄弟间使用。
  • 命名管道FIFO:半双工通信。任意进程间使用。

下面对匿名管道和命名管道进行详细介绍。

匿名管道

匿名管道是在内核中开辟一块缓冲区,而这块缓冲取没有具体的标识符,因此只能用于具有亲缘关系的进程间通信。
子进程可以通过复制父进程获得这块缓冲取(管道)的操作句柄,因为父进程创建管道的时候会接收到管道的操作句柄(文件描述符)。
这也是linux下一切皆文件的一种体现。

使用pipe函数进行创建:

int pipe(int fd[2]);

由参数fd返回两个文件描述符,fd[0]为读而打开 fd[1]为写而打开
通过这两个读写的端口就轻松实现了同步与互斥。
以代码为例:
在这里插入图片描述
运行结果&#

  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值