2013-03-07 96 views
0

因此,我正在编写一个涉及创建2组管道的程序,以便父进程可以写入到子进程&子进程可以回到顶端...dup2()导致子进程提前终止

我有下面的代码为我的孩子的过程:

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条件测试的下面时,所以我相信,这就是我的问题是)

在此先感谢

回答

2

的调用DUP2(FD2 [WRITE_END],STDOUT_FILENO)连接STDOUT(这是使用C++的cout流)到您的FD2管。所以'测试输出'被写入管道。

+0

哦,我,我多么愚蠢哈哈。感谢您指出了这一点 – 2013-03-07 21:23:59