我有一个从 stdin 读取的程序,在执行此操作时,它有时需要 fork() 并异步执行命令。有时在这个分支之后不久(可能在命令运行时),父级似乎丢失了从标准输入读取的数据。如果只丢失一个字节,程序将永远无法恢复。
fork() 的手册页说子级继承了父级打开的文件描述符集的副本,但是在 fork() 之后和 execvp() 之前尝试关闭(STDIN_FILENO)没有帮助。
我的程序基本上是这样的:
if (we_need_to_run_a_command_asynchronously) {
if (!fork()) {
close(STDIN_FILENO);
char *args[] = { "command", "arg", "etc", 0 };
setpriority(PRIO_PROCESS, 0, -19);
execvp("command", args);
exit(0); // Ignore errors
}
}
我如何确定 child 不会干扰 parent 的标准输入(或属于 parent 的任何其他东西)?执行的命令通常是 shell 脚本。
我不知道我的程序到底出了什么问题,但只要它不运行任何命令,它就可以正常运行。只是有时(并非总是)在它运行命令后,它从 stdin 读取的数据以某种方式被破坏,这就是为什么我怀疑问题与 fork() 之后的 stdin 有关。
最佳答案
您可以打开另一个文件并使用 dup2 而不是关闭标准输入将新文件描述符复制到标准输入。如果您打开 /dev/null
并将其重定向到 fork
之后和 exec
之前的 stdin,子进程将不会干扰父进程的 stdin。
关于c - 如何防止 child 在 fork() 后干扰 parent 的标准输入,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30810719/