【问题标题】:dup2( ) causing child process to terminate earlydup2() 导致子进程提前终止
【发布时间】:2013-03-07 21:17:20
【问题描述】:

所以我正在编写一个程序,该程序涉及创建 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) &lt; 0 测试下面时,它会输出,但当我把它放在另一个 dup2 条件下面时却没有测试,所以我确信这就是我的问题所在)

提前致谢

【问题讨论】:

    标签: c++ unix fork pipe dup2


    【解决方案1】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-12-22
      • 2011-01-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-03-11
      相关资源
      最近更新 更多