无名管道
管道的整体(有名、无名)概念:我们通常把一个进程的输出通过一块内存连接到另外一个进程的输入。
特征:
1.半双工通讯方式,同一时刻数据只能单向流动。
2.类似于数据结构中的队列,遵循先进先出的原则。
3.管道中的数据具有一次性,一旦被读走,将被从管道中移除。
4.没有具体的文件名标识,所以只能在父子进程中通讯。
5.管道所传送的数据是无格式的,这要求管道的读出方与写入方必须事先约定好数据的格式,如多少字节算一个消息等
下面用图示解释它的创建以及使用:
有名管道
概念上面已经说过。
特征:1.有名管道有文件名作为标识符,所以可在任意两个进程之间进行通信
2.创建管道有两种形式:一 ,是在命令窗口使用mkfifo 管道名 二,是代码中调用系统函数mkfifio();之后的操作就把管道看作文件,使用文件操作就好打开: open 写数据:write 读数据:read 关闭:close
3.管道的各个接口会进行阻塞,例如:
如果一个进程以只写打开一个管道,而没有进程对这个管道进行读的权限打开,open就会阻塞到此处。知道有另一个进程以写的权限打开后,open才会执行下去。
read也会阻塞运行。如果其他进程没有给管道写入数据 ,read就会阻塞直至其他进程给管道内写入数据。如果当一个进程以写方式打开管道后,关闭了管道的写端,或者直接结束掉了进程,read不会阻塞,而是会直接返回0。
write虽然也会阻塞运行,但阻塞条件比较难达成,就是管道写满的情况。
管道的大小具体是多少。我们可以简单来测一下。
65536=64K;