进程间通信是计算机系统中不同进程之间进行数据交换和共享信息的方式。
父子进程之间其他地址空间不一样,但共享同一块内核空间。
进程间通信的本质还是通过内核开辟缓冲区,一个进程写,一个进程读这样的工作原理。
常见的通信方式包括:
1.管道(Pipe):一种单向通信方式,用于在父子进程或者兄弟进程之间传输数据。
2.命名管道(Named Pipe):与管道类似,但具有路径名与之关联,允许无亲缘关系的进程间进行通信。
3.信号(Signal):用于通知进程发生了某种事件,例如中断信号。
4.消息队列(Message Queue):允许进程通过消息传递进行通信,消息在队列中按顺序排列。
5.共享内存(Shared Memory):允许多个进程访问同一块物理内存,实现高效的数据共享。
6.套接字(Socket):在网络编程中常见,允许不同主机上的进程进行通信。
7.信号量(Semaphore):用于控制对共享资源的访问,防止多个进程同时访问造成的竞争条件。
8.文件(File):通过读写文件进行通信,也可以通过文件锁实现进程间的同步和互斥。
管道
管道是最基本的一种IPC机制,只能用于有血缘关系的父子进程或者是兄弟进程。
特点:
本质是一个伪文件(内核缓冲区)
- 基于环形队列机制,内核里的一个缓冲区
- 一个读文件描述符,一个写文件描述符
- 管道规定写段流入,读端流出
局限性:
- 双向半双工(socket通信是双向全双工)
- 不能自己写自己读
- 数据读完就没了,不能反复读取(读完描述符地址后移不可恢复)
- 只能有公共祖先的进程之间
上面几个特点和局限性都可以借助环形队列来理解。
管道的基本用法
int pipe(int fd[2]) //创建并打开管道
fd[0]:读端
fd[1]:写端
返回值0为成功
读端:
1.管道中有数据 read返回读到的字节数
2.管道中没数据 :
1.写端无描述符 read返回0(类似读到文件尾)
2.写段有描述符 read阻塞等待
写段:
1.读端全部被关闭 进程被异常终止
2.读端没有被全部关闭
1.管道没满,write数据,返回写入的实际字节数
2.管道满,write阻塞等待