在进程间完成数据传递需要借助操作系统提供特殊的方法,如:文件,管道,信号,共享内存,消息队列,套接字,命名管道等。随着计算机的蓬勃发展,一些方法由于自身设计缺陷被淘汰或者弃用。现今常用的进程间通信方式有:
①管道(使用最简单)
②信号(开销最小)
③共享映射区(无血缘关系)
④本地套接字(最稳定)
管道
1.其本质是一个伪文件(实为内核缓冲区)
2.由两个文件描述符引用,一个表示读取端,一个表示写入端
3.规定数据从管道的写入端流入管道,从读取端流出。
管道的原理:管道实为内核使用环形队列机制,借助内核缓冲区(4K)实现。
管道的局限性:
①数据自己写不能自己读。
②数据一旦被读走,便不在管道中存在,不可反复读取。
③由于管道采用半双工通信方式。因此,数据只能在一个方向上流动。
④只能在有公共祖先的进程间使用管道。
常见的通信方式有,单工通信,半双工通信,全双工通信。
pipe函数 参数fd[2](传出参数) 返回值 成功 0 失败-1
fd[0]是读,fd[1]是写。
管道读写行为
①读管道 管道中有数据 read返回实际读到的字节数
管道中无数据 写端全关闭:read返回0,仍有写端打开:阻塞等待
②写管道 读端全关闭 进程异常终止(SIGPIPE信号)
有读端打开 管道未满:写数据,返回写入字节数
管道已满:阻塞(少见)
父子进程间通信 ls | wc -l
获取管道缓冲区大小 命令:ulimit -a 函数 fpathconf 参2:__PC_PIPE_BUF