2014-09-28 53 views
1

我有fork了多次父进程。我在程序开始时管道一次,然后分叉多次。我是否可以在所有孩子中使用相同的文件描述符来写入父级?或者我必须为每个新的孩子铺设管道,并为每个孩子分别提供一个文件描述符?管叉:跨多个孩子共用一个文件描述符

截至目前,第一个孩子可以写入管道写端没有问题,但第二个孩子时,它尝试写入得到一个坏的文件描述符的错误。

的代码写在所有的孩子一样。

+0

当你发现,你可以完全共享跨越fork'ed工艺管道的FD - 那么这取决于你如何写数据,如果多个进程写入同一管道的数据可能会混到 - - 根据通信的目的,这可能会或可能不会导致问题。 – Soren 2014-09-28 13:02:22

+0

谢谢。该计划是一个学校项目的模拟调度程序,向我们展示基本的信号。一次只能运行一个过程,因此不会出现竞赛状况。 – ReX357 2014-09-28 13:08:37

回答

0

所以我是一个傻瓜。当我进入程序时,我分叉了一次,关闭了父级管道的写入端,然后再次分叉,为任何后来的孩子提供封闭的写入结束。

pipe(fd); 
pid = fork(); 

if (!pid) { /* Insert first child code */ } 
else { 

    close(fd[1]); /* Close write end of pipe */ 

    pid = fork(); /* Fork again. */ 
    /* ... */ 

} 
1

但是,当它试图写入第二个孩子得到一个坏文件描述符错误。

当然,因为每个新进程都需要打开新文件来处理才有效。 刚打开管道为每个新工艺

#include <stdio.h> 
#include <stdlib.h> 
#include <unistd.h> 

#include <sys/stat.h> 
#include <sys/types.h> 

#include <fcntl.h> 
char str1[] = "string from 1-st proc"; 
char str2[] = "string from 2-st proc"; 
int main(int argc, char *argv[]) 
{ 
    char buf[100]; 
    mkfifo("/tmp/my_fifo", 0777); 
    if (fork() == 0) { 
     //it is child 
     int pipe_chld = open("/tmp/my_fifo", O_WRONLY); 
     write(pipe_chld, str1, sizeof(str1)); 
     if (fork() == 0) { 
      //it is child 
      int pipe_chld = open("/tmp/my_fifo", O_WRONLY); 
      write(pipe_chld, str2, sizeof(str2)); 
      exit(0); 
     } else { 
      exit(0); 
     } 
    } else { 
     //it is parent 
     int fd_fifo = open("/tmp/my_fifo", O_RDONLY); 
     read(fd_fifo, buf, 100); 
     read(fd_fifo, buf + sizeof(str1), 100); 
     printf("%s, %s\n", buf, buf + sizeof(str1)); 
     exit(0); 
    } 
} 
+0

其实我刚解决这个问题,我不需要一个新的管道。一旦我分叉了一次,我就关闭了父母的管道写端,因此任何进一步的分叉都为孩子提供了封闭的一端。 – ReX357 2014-09-28 12:49:04

+0

你不需要新的管道,你需要重新打开旧管为每个新工艺 – 2014-09-28 12:50:43

+2

不能重新打开一个封闭的管道。一旦关闭,关闭。事实上,你会如何做到这一点?开放系统调用不会将文件描述符作为参数。 – ReX357 2014-09-28 12:55:17