gpt4 book ai didi

c - 如何防止 child 在 fork() 后干扰 parent 的标准输入

转载 作者:行者123 更新时间:2023-12-03 23:09:58 26 4
gpt4 key购买 nike

我有一个从 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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com