我正在尝试更好地理解父进程和多个子进程之间的管道,所以我创建了一个简单的程序,它产生两个子进程,给它们一个值(i
),让它们改变那个值,以及然后打印出来。
然而它不起作用,因为程序打印i
就好像它没有改变一样,并在子项内打印改变的i
。我显然没有正确发送i
变量,所以我该如何解决这个问题?
int main ( int argc, char *argv[] ){
int i=0;
int pipefd[2];
int pipefd1[2];
pipe(pipefd);
pipe(pipefd1);
pid_t cpid;
cpid=fork();
cpid=fork();
if (cpid ==0) //this is the child
{
close(pipefd[1]); // close write end of first pipe
close(pipefd1[0]); // close read end of second pipe
read(pipefd[0], &i, sizeof(i));
i=i*2;
printf("child process i= %d\n",i); //this prints i as 20 twice
write(pipefd1[1],&i, sizeof(i));
close(pipefd[0]); // close the read-end of the pipe
close(pipefd1[1]);
exit(EXIT_SUCCESS);
}
else
{
close(pipefd[0]); // close read end of first pipe
close(pipefd1[1]); // close write end of second pipe
i=10;
write(pipefd[1],&i,sizeof(i));
read (pipefd1[1], &i, sizeof (i));
printf("%d\n",i); //this prints i as 10 twice
close(pipefd[1]);
close(pipefd1[0]);
exit(EXIT_SUCCESS);
}
}
答案 0 :(得分:1)
主要问题是您没有创建两个子进程。你创造了三个。
cpid=fork();
cpid=fork();
第一个fork
会导致创建子进程。此时,子节点和父节点都执行下一个语句,该语句也是fork
。因此父母创建一个新孩子,第一个孩子也创建一个孩子。这就是为什么一切都打印两次。
您需要在执行任何其他操作之前立即检查fork
的返回值。
如果您要删除其中一个fork
来电,您仍然会在父母的i
中找到错误的值。这是因为它从管道的错误端读取。
孩子正在写信pipefd1[1]
,但父母也在尝试阅读pipefd1[1]
。应该从pipefd1[0]
开始阅读。
编辑:
删除了错误的示例代码,假设管道是双向的,但它们不是。