Linux管道通信问题
发布网友
发布时间:2022-05-10 13:27
我来回答
共1个回答
热心网友
时间:2023-10-10 07:29
管道创建的时候读端和写端就已经打开了,不需要再次打开。
fork()之后就变成两个进程了,子进程会继承父进程调用fork()之前打开的所有文件描述符(管道也是文件,一种特殊的文件)。
在进程控制块中有一个数组标识了所有该进程已打开的文件,而文件描述符实际上就是这个数组的下标。
但是,一定要记得这是两个进程,也就是说现在有两个进程都打开了这个管道。在一个进程中关闭它的读端或者写端并不会影响另一个进程中该管道的状态。对这个示例程序来说就是:在父进程中关闭读端,但是在子进程中读端还是打开的。同理,在子进程中关闭写端也并不会影响父进程,在父进程中写端仍然是打开的。
fork()之后两个进程都有可能得到调度运行,至于谁先得到调度谁后得到调度则是不确定的,每次的结果可能都不一样(即使在子进程中调用了sleep函数也不一定能保证父进程先得到调度)。管道是同步的进程间通信方式,也就是说写端调用write往管道中写入消息的时候进程会被阻塞在write函数上,只有当读进程把管道中的消息取走之后才会返回(严格来说是进入就绪状态)。
关于linux api你可以看看我在百度知道上共享的《Linux内核源代码情景分析》,里面有详细的描述。 建议多看看进程管理和进程间通信那两章,了解进程的四要素和同步/异步的区别。