Linux环境进程间通信:管道及有名管道(2)

时间:2021-10-15 13:33:21

作者:admin

来源:纯净之家


系统大全为您提供
 
#include #include main(){ int pipe_fd[2]; pid_t
  则输出结果为: Broken pipe,原因就是该管道以及它的所有fork()产物的读端都已经被关闭。如果在父进程中保留读端,即在写完pipe后,再关闭父进程的读端,也会正常写入pipe,读者可自己验证一下该结论。因此,在向管道写入数据时,至少应该存在某一个进程,其中管道读端没有被关闭,否则就会出现上述错误(管道断裂,进程收到了SIGPIPE信号,默认动作是进程终止)
  对管道的写规则的验证2:linux不保证写管道的原子性验证
  #include #include #include main(int argc
  结论:
  写入数目小于4096时写入是非原子的!
  如果把父进程中的两次写入字节数都改为5000,则很容易得出下面结论:
  写入管道的数据量大于4096字节时,缓冲区的空闲空间将被写入数据(补齐),直到写完所有数据为止,如果没有进程读数据,则一直阻塞。
  1.4管道应用实例:
  实例一:用于shell
  管道可用于输入输出重定向,它将一个命令的输出直接定向到另一个命令的输入。比如,当在某个shell程序(Bourne shell或C shell等)键入who│wc -l后,相应shell程序将创建who以及wc两个进程和这两个进程间的管道。考虑下面的命令行:
  $kill -l 运行结果见附一。
  $kill -l | grep SIGRTMIN 运行结果如下:
  30) SIGPWR 31) SIGSYS 32) SIGRTMIN 33) SIGRTMIN+134) SIGRTMIN+2 35) SIGRTMIN
  实例二:用于具有亲缘关系的进程间通信
  下面例子给出了管道的具体应用,父进程通过管道发送一些命令给子进程,子进程解析命令,并根据命令作相应处理。
  #include #include main(){ int pipe_fd[2]; pid_t
  1.5管道的局限性
  管道的主要局限性正体现在它的特点上:
  只支持单向数据流;
  只能用于具有亲缘关系的进程之间;
  没有名字;
  管道的缓冲区是有限的(管道制存在于内存中,在管道创建时,为缓冲区分配一个页面大小);
  管道所传送的是无格式字节流,这就要求管道的读出方和写入方必须事先约定好数据的格式,比如多少字节算作一个消息(或命令、或记录)等等;
  2、 有名管道概述及相关API应用
  2.1 有名管道相关的关键概念
  管道应用的一个重大限制是它没有名字,因此,只能用于具有亲缘关系的进程间通信,在有名管道(named pipe或FIFO)提出后,该限制得到了克服。FIFO不同于管道之处在于它提供一个路径名与之关联,以FIFO的文件形式存在于文件系统中。这样,即使与FIFO的创建进程不存在亲缘关系的进程,只要可以访问该路径,就能够彼此通过FIFO相互通信(能够访问该路径的进程以及FIFO的创建进程之间),因此,通过FIFO不相关的进程也能交换数据。值得注意的是,FIFO严格遵循先进先出(first in first out),对管道及FIFO的读总是从开始处返回数据,对它们的写则把数据添加到末尾。它们不支持诸如lseek()等文件定位操作。
 
  
  以上就是系统大全给大家介绍的如何使的方法都有一定的了解了吧,好了,如果大家还想了解更多的资讯,那就赶紧点击系统大全官网吧。 
 
本文来自系统大全http://www.win7cn.com/如需转载请注明!

系统下载排行榜71011xp

提取码
XGZS
关闭 前往下载