常见的通信方式有,单工通信、半双工通信、全双工通信。
pipe 函数
创建管道
int pipe(int pipefd[2]); 成功:0;失败:-1,设置 errno
函数调用成功返回 r/w 两个文件描述符。无需 open,但需手动 close。规定:fd[0] → r; fd[1] → w,就像 0
对应标准输入,1 对应标准输出一样。向管道文件读写数据其实是在读写内核缓冲区。
管道创建成功以后,创建该管道的进程(父进程)同时掌握着管道的读端和写端。如何实现父子进程间通信呢?
通常可以采用如下步骤:
1. 父进程调用 pipe 函数创建管道,得到两个文件描述符 fd[0]、fd[1]指向管道的读端和写端。
2. 父进程调用 fork 创建子进程,那么子进程也有两个文件描述符指向同一管道。
3. 父进程关闭管道读端,子进程关闭管道写端。父进程可以向管道中写入数据,子进程将管道中的数据读
出。由于管道是利用环形队列实现的,数据从写端流入管道,从读端流出,这样就实现了进程间通信。
练习:父子进程使用管道通信,父写入字符串,子进程读出并,打印到屏幕。 【 pipe.c】
思考:为甚么,程序中没有使用 sleep 函数,但依然能保证子进程运行时一定会读到数据呢?
管道的读写行为
使用管道需要注意以下 4 种特殊情况(假设都是阻塞 I/O 操作,没有设置 O_NONBLOCK 标志):
1. 如果所有指向管道写端的文件描述符都关闭了(管道写端引用计数为 0),而仍然有进程从管道的读端读数
据,那么管道中剩余的数据都被读取后,再次 read 会返回 0,就像读到文件末尾一样。
评论0
最新资源