繁体   English   中英

2个孩子写入管道,父母从C中的管道读取

[英]2 children write to pipe, parent reads from pipe in C

我搜索了一下,但都无济于事,所以我终于来寻求帮助。 我的工作涉及(在RedHat Linux上运行的C中)创建两个子进程,每个子进程将用于任意迭代次数的字符写入管道。 该管道与创建它们的父进程共享。 父级从管道中读取,而子级仍然有字符要写入。 一旦孩子退出并且管道为空,父(主)便可以终止。

这是我编写的代码逻辑的简单而肮脏的示例。

main()
{
      //create pipe

      fork(); //childA
      //writes to pipe 

      fork(); //childB
      //writes to pipe

      //parent reading
      while(condition) {
          //read from pipe + print chars to terminal
      }
}

现在,我的问题是关于while循环的条件。 当孩子们由于管道已满而被阻止写作时,我需要阅读,但是我无法弄清楚哪种情况允许我这样做。 任何帮助绝对是惊人的。

阅读时是否需要将管道填满? 还是只是要求您即使两个管道中的一个已满,也要继续从两个孩子那里读书,以使孩子无法写作?

如果管道已满,我不知道有什么标准的高高方法。 您可以尝试使用FIONREAD ioctl来确定要在管道上读取的数据量,并将其与PIPE_BUF进行比较,但是如果PIPE_BUF数据少于PIPE_BUF ,则该方法可能无法正常工作,但是孩子正在写数据那将把它放在PIPE_BUF 该调用可能会阻塞而不填满管道。 我不会依靠这种技术来工作。

无论选择哪个文件描述符,都可以从两个文件描述符中进行读取的通常方法是使用select系统调用。 这使您可以等到一个或另一个文件描述符中有可用数据。 这意味着父进程不会阻止尝试从一个没有可用数据的子进程读取数据,而另一个进程因为其缓冲区已满而正在阻塞。

编辑 :重新阅读您的问题后,听起来好像实际上只有两个孩子正在写的管道。 那是对的吗? 再次出现一个问题,是否需要您等到孩子们阻塞之前。 如果父母简单地从管道读取,它将阻塞直到其中一个孩子已写入管道; 您不需要做任何特别的事情。

如果您的作业要求您等到管道实际装满后,我将有兴趣查看确切的用词,因为我不确定您为什么要这样做。

编辑2 :针对您在评论中的问题:

  1. 我的父进程的代码是否需要遵循程序中两个子进程的代码?

    不,对父或子进程的代码顺序没有要求。 为了区分父代运行的代码和子代运行的代码,请检查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. 
  2. 我如何继续从管道读取直到两个孩子终止并且管道为空?

    只要保持阅读,直到read返回0 read ,直到所有进程都关闭了管道的写端在管道的读端将不会返回0,并且所有的数据已读出的管道。 如果仍有东西打开,但管道中没有数据,则read将阻塞,直到将数据写入管道为止。

    一个陷阱是要记住在尝试read之前在父进程中关闭管道的写入端。 否则,当父级在子级完成之后尝试进行read ,它将阻止等待它关闭自己的管道。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM