Linux中进程通信

x33g5p2x  于2021-09-28 转载在 Linux  
字(0.7k)|赞(0)|评价(0)|浏览(331)

进程之间需要通信,主要有以下方式:

1、信号量

生产者-消费者模型就是通过信号量来通信,当一个进程需要其他进程完成操作后才能执行的时候,就自我阻塞,进入睡眠状态。当其他进程完成操作后,会像进程发送信号,进程会被唤醒,然后继续执行。

2、管道

匿名管道
管道就是在内核中开辟的一块缓存,提供了两个文件描述符,一个用于写入,一个用于读取。

然后将进程fork,子进程会复制对应的FD,然后将父进程的读端关闭,子进程的写段关闭,就可以进行通信了。

命名管道
命名管道引入了路径的概念来标识一个管道,就是给管道起了一个名字。

有什么好处呢?

不存在血缘关系的进程也可以通过路径来找到对应的管道,从而写入或者读取数据。

命名管道和匿名管道的区别:
1、匿名管道只能父子或者兄弟进程之间进行通信, 命名管道所有进程之间都可以通信。

匿名管道和命名管道都是半双工的,一个进程写入的时候,另一个进程只能读取。

3、共享内存

IPC中多个进程可以通过同一个key申请同一个物理内存,然后和自己的虚拟地址进行映射,多个进程之间共享一片内存。

由于多个进程有可能同时访问内存,所以要设置信号量来保证内存的线程安全。

多个进程之间也需要一个key来同时申请一个信号量,然后通过信号量来安全的进行读取和写入数据。

共享内存和管道的区别

1、 共享内存速度块。共享内存是基于用户空间的,可以直接读取和写入。而管道是在内核空间由内核维护的一个缓存,进程还需要内核空间拷贝和用户空间之间的拷贝。
2、 共享内存是全双工的,而管道是半双工的。
3、 共享内存没有提供同步机制,需要用户自己实现,而管道内核提供了同步机制。

相关文章