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

系统大全为您分享 #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/如需转载请注明!

下载仅供下载体验和测试学习,不得商用和正当使用。

下载体验

请输入密码查看下载!

如何免费获取密码?

点击下载

评论