一、管道文件
1、A进程---->B进程 A进程的数据流通过通道向B进程
2、半双工通讯:数据流向单向传输 (同一时间)
全双工通讯:数据流向双向传输 (同一时间)
注意:管道内数据流向没有定,所以理论上A也可以读,但是,A写入又读出没有意义,所以有名管道是任意两个进程之间的通讯。
3、管道文件既不是文件又不是进程空间,那又如何创建和操作呢?
二、管道操作
1、有名管道:应用于任意两个有名称进程之间数据的单向传递。
在文件目录树中有一个文件标识(管道问件),实际不占据磁盘空间,数据缓存在内存上。
2、创建:命令方式:mkfifo
函数方式:mkfifo( ) (命令在控制终端用,函数在程序中调用)
3、打开:写数据:write 读数据:read 关闭:close
4、maina.c:将A进程的内容写入管道文件
mainb.c:将管道文件的内容读入B进程
运行情况:
(1)./maina 无结果 因为只有写,没有读
阻塞运行:open没返回,导致整个进程阻塞
打开另一个终端 ./mainb 输出结果。因为在之前写已经成功了,读运行后就会完成进程间的通讯。
5、阻塞运行函数:函数运行以后不会立即返回,需要某些条件的发生才会返回。open操作管道文件时,阻塞运行的函数。
(1)如果一个进程以“只写”方式打开一个管道文件,open会阻塞运行,直到有一个进程以“读”的方式打开管道文件,open才会返回,进程接着执行。
(2)如果一个进程以“只读”方式打开一个管道文件,open会阻塞运行,直到有一个进程以“写”的方式打开管道文件,open才会返回,进程接着执行。
(3)read函数也会阻塞运行,直到写端写入数据或所有的写端都关闭。
(4)wrirte不阻塞 (阻塞条件:管道写满了 因为在内存开辟,所以有大小限制)