一、什么是IPC机制
概念:
IPC机制:Inter Process Communication,即进程间通信机制。
进程与进程间的用户空间相互独立,内核空间共享。所以如果要实现进程间的通信,需要使用进程间通信机制。
分类(3类):
- 传统的进程间通信机制
无名管道 pipe 有名管道 fifo 信号 signal - system v操作系统的IPC对象
消息队列 message queue 共享内存 shared memory 信号灯集 semaphore - 可用于跨主机传输的通信
套接字 socket
二、管道
2.1 管道的原理
在进程的3~4G内核空间中,创建一个管道(特殊的文件),管道中的数据是直接存储在内存中的。

2.2 管道的特性
1) 管道可以看成是一个特殊的文件,一般的文件存放在磁盘上,而管道中的内容存储在内存中。
2) 管道遵循先进先出的原则。(队列形式实现);
3) 管道的大小:64K = 64*1024 = 65536bytes ;
4) 对于管道的读操作是一次性的,如果对管道进行读操作,那么被读取的数据会从管道中删除 ;
5) 管道是一种半双工的通信方式 :
单工:只能A发消息给B,B无法发消息给A; 半双工:同一时间,只能A发消息给B,或者B发消息给A; 全双工:同一时间,可以双方通信。6) 当管道的读写端均被关闭的时候,此时会释放管道在内核内存中的空间 ;
7) 从管道中读取数据
· 当管道的读写端均存在
① 管道中没有数据的时候读函数阻塞。
② 管道中实际拥有的个数a(10个),大于要读取的数据个数b(5个),则实际读取b(5个);
③ 若管道中有5个数据,读取10个,实际读5个
· 当管道的写端不存在(父子进程的写端均关闭)
① 此时去读取数据,若管道中原来存在数据,则先将数据读取完毕,
② 若没有数据了,read函数不阻塞,且read函数立即返回0;8) 向管道中写入数据
· 当管道的读写端均存在
① 管道写满后write函数会阻塞。· 当管道的写端不存在(父子进程的写端均关闭)
① 此时只要尝试向管道中写入数据(只要调用了write函数),调用write函数的进程会收到一个管道破裂信号,该信号会导致当前进程退出
② 管道破裂信号:SIGPIPE
2.3 无名管道(pipe)
1) 无名管道的特点
- 无名管道:顾名思义即没有名字的管道文件,在用户空间不可见的管道文件
- 无名管道只能用于具有亲缘关系的进程间通信。
- 由于无名管道存在于内核空间中,所以我们需要直接对内核进行操作,此时只能使用系统调用函数,即只能使用文件IO函数,例如:open read write close 。 但是不能使用lseek函数。
无名管道只能用于具有亲缘关系的进程间通信,为什么?
- 无名管道在文件系统中不可见,所以无亲缘关系的进程无法拿到同一根管道的读写端。
- 子进程会克隆父进程的文件描述符表,所以可以在父进程中创建一根管道,然后fork一份资源给子进程,此时子进程可以拿到与父进程相同的文件描述符表。即可以拿到同一根无名管道的读写端。
2) pipe
功能:创建一个无名管道,同时打开无名管道的读写端;

本文介绍了Linux系统中IPC(进程间通信)机制,包括管道和信号。管道分为无名管道和有名管道,阐述了其原理、特性及操作方法,并给出相关代码示例。信号部分介绍了概念、处理方式、常见信号及相关函数,如signal、kill、alarm等,还说明了用信号回收僵尸进程的方法。
最低0.47元/天 解锁文章
1035

被折叠的 条评论
为什么被折叠?



