dup2()导致子进程提前终止

时间:2013-03-07 21:17:20

标签: c++ unix fork pipe dup2

所以我正在编写一个涉及创建2组管道的程序,以便父进程可以写入子进程&孩子的过程可以回来......

我的子进程有以下代码:

if(pid==0){  //child process
        cout << "executing child" << endl;
        close(fd1[WRITE_END]);
        close(fd2[READ_END]);
        if(dup2(fd1[READ_END],STDIN_FILENO) < 0 || dup2(fd2[WRITE_END],STDOUT_FILENO) < 0){
            cerr << "dup2 failed" << endl;
            exit(1);
        }
        cout << "test output" << endl;
        close(fd2[WRITE_END]);
        close(fd1[READ_END]);
        read(fd1[READ_END],buf,BUFFER_SIZE);
        cout << "Child process read " << buf << endl;
        execl("/bin/sort", "sort", "-nr", NULL);


    } else {  //... parent process

当我运行我的程序时,我从子进程输出的所有内容都是executing child但没有test output。 但是,当我删除处理dup2调用的if语句时,我的输出包含test output

关于为什么dup2导致我的子进程无法完成终止的任何想法?

(顺便说一句,最初,我的两个dup2是在单独的if语句中完成的......当我把测试输出放在dup2(fd1[READ_END],STDIN_FILENO) < 0测试下面时,它输出,但是当我把它放在另一个下面时dup2条件测试,所以我确信这就是我的问题所在。)

提前致谢

1 个答案:

答案 0 :(得分:2)

对dup2的调用(fd2 [WRITE_END],STDOUT_FILENO)将STDOUT(由C ++ cout流使用)连接到fd2管道。因此'测试输出'被写入管道。