C中进程之间的管道

时间:2015-09-29 09:00:19

标签: c pipe

我正在尝试理解C中的管道。我已经构建了两个应该正常工作的测试程序,但在运行时,第二个打印未初始化的字符而不是预期的字符串。我有什么明显的遗失吗?

int main() 
{
    int parentToChild[2]; //1 Write
    int childToParent[2]; //0 Read
    pipe(parentToChild);
    pipe(childToParent);
    int parent = fork();    
    if(!parent)
    {
        close(parentToChild[1]);
        close(childToParent[0]);
        dup2(1,childToParent[1]); //sets child's stdout to send to parent
        dup2(0,parentToChild[0]); //sets child's stdin to come from parent
        execl("./program","./program",NULL);
    }    
    close(childToParent[1]);
    close(parentToChild[0]);
    FILE* readin = fdopen(childToParent[0],"r");
    FILE* writeto = fdopen(parentToChild[1],"w");
    fprintf(writeto,"msg\n");
    fflush(writeto);
    return 0;
}      
int main()
{        //The child process
    fprintf(stderr,"Program started\n");
    char buff[1024];
    fgets(buff,1024,stdin);
    fprintf(stderr,"%s",buff);
}

1 个答案:

答案 0 :(得分:1)

问题在于:

            dup2(1,childToParent[1]); // Error!
            dup2(0,parentToChild[0]); // Error!

切换dup2调用中文件描述符的顺序。要修复代码,您必须通过以下方式更改这些行:

            dup2(childToParent[1],1); //sets child's stdout to send to parent
            dup2(parentToChild[0],0); //sets child's stdin to come from parent

dup2(new_fd,old_fd)使 newe fd 成为旧fd 参数的副本。有关详细信息,请查看dup2的手册页。

注意:我通过引入上述更改来测试您的代码,现在它正常运行。