gpt4 book ai didi

ruby - 如何终止使用 system() 生成子进程的进程?

转载 作者:可可西里 更新时间:2023-11-01 10:19:25 24 4
gpt4 key购买 nike

我在 Windows 7 上使用 Cygwin(尽管同样的问题可能也适用于 native Linux 环境)。

一个父进程——碰巧是一个 Ruby 程序,但我想如果这是一个纯 C 应用程序也会出现同样的问题——使用 system() 来执行一个外部(可能很长) -运行)命令。

当这个外部程序运行时,父进程被杀死。子进程仍然存在。我该怎么做才能确保子进程也被杀死?

这里有一个“沙箱”场景来解释这个问题:在一个终端窗口中,我执行以下命令:

ruby -e 'puts $$; system("sh")' # Could also be a C program

显然,在打印进程 ID 后,这将永远卡在 sh 命令上。

现在我从不同的终端窗口尝试

kill -INT ... 

杀死 Ruby 进程。使用 procps 或 ps,我可以验证这个进程是否仍然存在。现在我用

kill -TERM ....

不过,进程并没有被杀死。最后我做了一个

kill -KILL ....

当然,这可以完成工作。 Ruby 进程被杀死,但子进程('sh')仍然存在。

我知道这是预期的行为,但是什么是简单可靠的解决方法?

我尝试建立一个 session 并在执行 system 之前调用了 Process.setsid,但我收到了错误消息

`setsid':不允许操作(Errno::EPERM)

也许 setsid 在 Cygwin 上不可用,这不会让我感到惊讶,因为 Windows 进程处理非常不同。

任何其他想法,我可以尝试什么?顺便说一句,代码最终应该移植到 Linux,所以如果可能的话,我想使用一个在 Cygwin 和 Linux 下运行的解决方案。

最佳答案

this关于 Ruby 异步处理的精彩博客,它建议在 Linux 中使用 fork,在 Windows 中使用 spawn,我建议在 Cygwin 中尝试这两种方法

pid = fork do
exec 'sleep', '10'
end
Process.kill pid

关于ruby - 如何终止使用 system() 生成子进程的进程?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32965251/

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