第一部分:进程间通信概述
进程间通信的常见方式
· 管道(无名管道、有名管道)
· 信号
· 消息队列
· 共享内存
· 信号灯(信号量)
第二部分:无名管道
- 无名管道的特点
· 只能用于具有亲缘关系的进程间通信(如父子进程)。
· 管道本质上是一段位于内核空间的缓存区,读写两端通过文件描述符操作。
- 创建函数 pipe
· 创建一段用于进程间通信的内核缓存区。
· 通过两个文件描述符操作管道:读端和写端。
· 成功返回0,失败返回-1。
- 管道的读写特性
有写端存在时:
· 管道中有数据:直接读出。
· 管道中无数据:读端阻塞等待,直到有数据写入。
无写端存在时:
· 管道中有数据:直接读出。
· 管道中无数据:读端立即结束,不阻塞等待。
有读端存在时:
· 管道未写满(容量约64K):直接写入。
· 管道已写满:写端阻塞,等待数据被读取后才能继续写入。
无读端存在时:
· 写入数据会产生管道破裂错误,导致进程直接退出。
第三部分:有名管道
- 有名管道的特点
· 可用于任意两个进程间通信(无论是否具有亲缘关系)。
· 通过文件系统中的管道文件来标识,进程通过路径名访问。
- 阻塞特性
· 读写两端必须同时打开才能继续执行。
· 若只有一端打开(只有读端或只有写端),则该端会阻塞等待,直到另一端加入。
- 创建函数 mkfifo
· 在文件系统中创建一个有名管道文件。
· 需指定管道文件的路径和访问权限。
· 成功返回0,失败返回-1。
第四部分:信号
- 信号的概念
信号是内核层与应用层之间通信的一种机制,用于通知进程发生了某种事件。
- 进程收到信号后的三种处理方式
· 缺省:按照系统默认方式处理信号(如终止进程、忽略等)。
· 忽略:不处理该信号,信号对进程无影响。
· 捕捉:按照用户指定的方式处理信号,即注册自定义信号处理函数。
- 常见信号种类
· SIGINT:中断信号(Ctrl+C)
· SIGQUIT:退出信号(Ctrl+\)
· SIGKILL:强制终止信号
· SIGTERM:终止信号
· SIGSTOP:暂停信号
· SIGSEGV:段错误信号
· SIGPIPE:管道破裂信号
· SIGALRM:定时器信号
· SIGCHLD:子进程状态变化信号
第五部分:关键概念辨析
无名管道 vs 有名管道
· 无名管道:仅限亲缘进程,无文件名,通过文件描述符操作。
· 有名管道:任意进程可用,有文件名,通过路径打开操作。
信号 vs 管道
· 信号:异步通信机制,用于通知事件,传输信息量极少。
· 管道:同步通信机制,用于传输数据流,信息量大。
写端存在性对读端的影响
· 写端存在时读端若无数据会阻塞等待。
· 写端不存在时读端若无数据则直接结束(读到文件末尾)。
读端存在性对写端的影响
· 读端存在且管道满时写端阻塞。
· 读端不存在时写端写入会触发管道破裂信号。