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

标签 c fork stdin

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

相关文章:

c - 使用函数代替运算符

c - 为什么 shell 和文件的输出不同

node.js - 将 GitHub 项目的分支发布到新的 NPM 模块,但保留与原始模块 merge 的选项?

php - 为什么 PHP 在向以 proc_open 启动的进程写入 4096 字节后会挂起?

c - 增加一个固定值的指针

c - 按字典顺序排列的字符串的非重复排列

C 通过 stdin 读取文件读取随机符号

character - perl6 如何重新打开 $*IN 进行输入?

c - 类型转换实际上有什么作用吗?

c - 如何将列表的节点存储到共享内存中