我有fork了多次父进程。我在程序开始时管道一次,然后分叉多次。我是否可以在所有孩子中使用相同的文件描述符来写入父级?或者我必须为每个新的孩子铺设管道,并为每个孩子分别提供一个文件描述符?管叉:跨多个孩子共用一个文件描述符
截至目前,第一个孩子可以写入管道写端没有问题,但第二个孩子时,它尝试写入得到一个坏的文件描述符的错误。
的代码写在所有的孩子一样。
我有fork了多次父进程。我在程序开始时管道一次,然后分叉多次。我是否可以在所有孩子中使用相同的文件描述符来写入父级?或者我必须为每个新的孩子铺设管道,并为每个孩子分别提供一个文件描述符?管叉:跨多个孩子共用一个文件描述符
截至目前,第一个孩子可以写入管道写端没有问题,但第二个孩子时,它尝试写入得到一个坏的文件描述符的错误。
的代码写在所有的孩子一样。
所以我是一个傻瓜。当我进入程序时,我分叉了一次,关闭了父级管道的写入端,然后再次分叉,为任何后来的孩子提供封闭的写入结束。
pipe(fd);
pid = fork();
if (!pid) { /* Insert first child code */ }
else {
close(fd[1]); /* Close write end of pipe */
pid = fork(); /* Fork again. */
/* ... */
}
但是,当它试图写入第二个孩子得到一个坏文件描述符错误。
当然,因为每个新进程都需要打开新文件来处理才有效。 刚打开管道为每个新工艺
#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);
}
}
当你发现,你可以完全共享跨越fork'ed工艺管道的FD - 那么这取决于你如何写数据,如果多个进程写入同一管道的数据可能会混到 - - 根据通信的目的,这可能会或可能不会导致问题。 – Soren 2014-09-28 13:02:22
谢谢。该计划是一个学校项目的模拟调度程序,向我们展示基本的信号。一次只能运行一个过程,因此不会出现竞赛状况。 – ReX357 2014-09-28 13:08:37