通过管道发送和接收信息?

时间:2015-10-01 00:06:51

标签: c process pipe

我正在尝试更好地理解父进程和多个子进程之间的管道,所以我创建了一个简单的程序,它产生两个子进程,给它们一个值(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);
    }
}

1 个答案:

答案 0 :(得分:1)

主要问题是您没有创建两个子进程。你创造了三个。

cpid=fork();
cpid=fork();

第一个fork会导致创建子进程。此时,子节点和父节点都执行下一个语句,该语句也是fork。因此父母创建一个新孩子,第一个孩子也创建一个孩子。这就是为什么一切都打印两次。

您需要在执行任何其他操作之前立即检查fork的返回值。

如果您要删除其中一个fork来电,您仍然会在父母的i中找到错误的值。这是因为它从管道的错误端读取。

孩子正在写信pipefd1[1],但父母也在尝试阅读pipefd1[1]。应该从pipefd1[0]开始阅读。

编辑:

删除了错误的示例代码,假设管道是双向的,但它们不是。