阅读时是否要求管道必须充满?还是仅仅是要求您继续阅读两个孩子的内容,即使其中一个管道已满,因此孩子无法书写?
如果管子满了,我不知道有什么标准的增高方法。您可以尝试使用FIONREAD
ioctl 来确定管道上要读取的数据量,并将PIPE_BUF
其PIPE_BUF
与它结束了PIPE_BUF
;该调用可能会阻塞而不填满管道。我不会依赖这种技术工作。
继续从两个文件描述符中读取的常用方法,无论哪个已准备好,都是使用select
系统调用。这允许您等到一个或另一个文件描述符有可用数据。这意味着父进程不会阻止尝试从一个没有任何可用数据的子进程中读取数据,而另一个子进程会因为缓冲区已满而阻塞。
编辑:重新阅读您的问题后,听起来实际上只有一个管道,两个孩子都在写信。那是对的吗?同样,问题出现了,您是否需要等到孩子们阻塞。如果父级只是从管道中读取,它将阻塞,直到其中一个子级写入管道为止;你不需要做任何特别的事情。
如果您的任务要求您等到管道实际上已满,我有兴趣查看确切的措辞,因为我不确定您为什么要这样做。
编辑2:针对您在评论中的问题:
我的父进程的代码是否需要遵循程序中我的两个子进程的代码?
不,对父进程或子进程的代码顺序没有要求。为了区分父级运行的代码和子级运行的代码,您检查fork()
. 如果返回值为 0,则处于子进程中。如果不是,那么您在父母中;如果返回值为-1,则有错误,如果为正,则为子进程的PID。
因此,您可以编写如下代码:
int pid = fork();
if (pid) {
// in the parent, check if pid is -1 for errors
} else {
// in the child
}
或者:
int pid = fork();
if (pid == 0) {
// in the child, do whatever you need to do and...
exit(0);
}
// in the parent; since the child calls exit() above, control will never
// reach here in the child. Or you could do an execl() in the child, which
// replaces the current program with another one, so again, control will
// never reach here within the child process.
我怎样才能继续从管道读取,直到两个孩子终止并且管道为空?
继续读取直到read
返回 0。read
在管道的读取端不会返回 0,直到所有进程都关闭了管道的写入端,并且所有数据都已从管道中读取出来。如果某些东西仍然打开,但管道中没有数据,read
则会阻塞,直到数据写入管道。
一个问题是记住在尝试之前关闭父进程中管道的写入端read
;否则,当父级在子级完成后尝试执行 a 时read
,它将阻塞等待它关闭自己的管道。