C++ 子进程输出的重定向

C++ 子进程输出的重定向,c++,redirect,child-process,C++,Redirect,Child Process,我正在重定向子进程的输出: int-pipefd[2]; 管道(pipefd); pid_t pid=fork();/*创建子进程*/ 开关(pid){ 案例-1:/*错误*/ 嗯,我有一个解决办法,尽管我不完全明白为什么会发生这种情况 但首先,应该清楚的是,这种行为既不正常也不可预期。使用fork()创建的子进程不会从其父进程继承任何正在运行的线程(因此意外的输出必须来自父线程)。并且它有自己的描述符表。因此,当子进程调用dup2()时要更改其输出描述符,这不应对父进程中的线程产生任何影响 只

我正在重定向子进程的输出:

int-pipefd[2];
管道(pipefd);
pid_t pid=fork();/*创建子进程*/
开关(pid){
案例-1:/*错误*/

嗯,我有一个解决办法,尽管我不完全明白为什么会发生这种情况

但首先,应该清楚的是,这种行为既不正常也不可预期。使用fork()创建的子进程不会从其父进程继承任何正在运行的线程(因此意外的输出必须来自父线程)。并且它有自己的描述符表。因此,当子进程调用dup2()时要更改其输出描述符,这不应对父进程中的线程产生任何影响

只有在execv()调用失败的情况下才会出现此问题。在这些情况下,我希望子进程的终止会关闭其所有文件描述符。但这没有发生,或者至少没有显式调用close()的效果。因此,在execv()后添加显式close()调用解决了此问题:

execv(args[0], (char * const *)args);
close(1);
close(2);
exit(1);
管道写入端描述符的关闭将导致读取端上的读取操作接收0,从而知道不再读取。 但是,我仍然不知道以下几点:

  • 为什么子进程中对exit()的调用不等于显式调用close()
  • 即使管道写入端没有关闭,为什么从读取端读取会在父进程中产生线程输出,而不是阻塞或返回一些错误

  • 如果有人能解释这一点,我们将不胜感激。

    其他线程是否也使用stdout和stderr来编写输出?那么这种行为是完全正常的,也是可以预期的。是的,他们这样做了,但我不明白为什么会导致这种行为。pipe()调用分配新的文件描述符,dup2()调用在中,子项不会影响父描述符表。您知道实际上会影响什么,是吗?它会在条目1的条目pipefd[1]处写入表中的任何内容。