杀死父进程后将标准输入传递给子进程

Posted

技术标签:

【中文标题】杀死父进程后将标准输入传递给子进程【英文标题】:Pass Stdin to child process after killing parent 【发布时间】:2015-12-12 13:33:18 【问题描述】:

我在 Go 中有以下代码:

cmd := exec.Command(...)
cmd.Stdout = os.Stdout
cmd.Stdin = os.Stdin
cmd.Stderr = os.Stderr
cmd.Run()

它生成另一个 Go 程序作为子进程,并将其 Stdin、Stdout 和 Stderr 设置为父进程。子进程生成后,我想通过父进程中的os.Exit() 或子进程中的syscall.Kill(os.Getppid(), syscall.SIGTERM) 杀死父进程。在我杀死父母之后出现了问题。它似乎关闭了 Stdin,因此子进程无法从生成父进程的终端接收输入。

我可以在杀死父级之前接收到子级的输入,所以绝对是杀死父级的动作会关闭 Stdin。有什么办法可以解决这个问题吗?

【问题讨论】:

启动孩子后家长需要做些什么吗?通常这就是你使用execve 系统调用(syscall.Exec in go)。 使用 syscall.Exec 就是答案!非常感谢。 【参考方案1】:

根据我的经验,我不知道有什么方法可以解决 Stdin 的问题。只有StdoutStderr 可以这样工作。

另一种方法是释放父进程正在使用的资源(即尽可能保持轻量)并让它等待子进程的执行。

【讨论】:

以上是关于杀死父进程后将标准输入传递给子进程的主要内容,如果未能解决你的问题,请参考以下文章

确定子进程是不是从标准输入读取

使用带有标准输入和标准输出重定向的 2 进程管道时如何避免标准输入上的重复输入

Python子进程错误:使用标准输入将输入传递到终端

如何在 C 语言中将输入和检索输出传递给子进程

如何在 node.js 子进程模块中将消息和标准输出从子进程传递给父进程?

获取 node.js 中所有嵌套子进程的标准输出