愚弄System.Diagnostics.Process WaitForExit()
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了愚弄System.Diagnostics.Process WaitForExit()相关的知识,希望对你有一定的参考价值。
有一个程序(c#)通过System.Diagnostics.Process启动我的脚本,然后在其上调用WaitForExit()。脚本(在这种情况下是python,但可能是任何东西)然后生成子进程并退出。我期望程序继续,但它会挂起,直到子进程退出。
我已经尝试了很多启动子进程的方法,从python的os.fork到编写shell脚本包装器,但是每个方法都会导致程序挂起。我无法更改c#程序的代码,我需要对子进程做什么才能让程序继续?
注意:我不知道它是否重要,但c#程序在ubuntu上以mono运行。
编辑:在WaitForExit调用之前进一步检查c#代码后,有一个while (!process.StandardOutput.EndOfStream)
循环,这可能是问题吗?
WaitForExit似乎挂在open stdout / stderr上。我使用这个脚本使我的脚本异步:
#!/bin/bash
~/foo.py "$@" >&- 2>&- &
希望这有助于下一个人的到来。
最简单的方法是让子进程setsid()
,它将删除它与你的所有连接 - 它成为新会话的会话负责人,以及新进程组的组长,并从你的stdio中删除,一次通话。
如果您无法修改子进程的代码,您可以通过显式fork
ing从Python父代执行,然后调用setsid
,然后调用exec
ing,而不是像subprocess
这样的各种常用清理器方法。像这样:
pid = os.fork()
if not pid:
sid = os.setsid()
os.execv(path, args)
我相信这是对System.Diagnostics.Process
很重要的过程组,但我实际上并不知道,所以我认为安全比抱歉更好。如果你想尝试os.setpgrp()
,你可以尝试一下。如果有效,你可以实际上spawn
/ subprocess
/等。孩子,然后只是setpgid(pid, pid)
。
同时,听起来你只是在给孩子做fork
ing并在那个孩子继续相同的剧本,在这种情况下你可以在setsid
之后添加setpgrp
(或者可能是fork
),你应该完成。
以上是关于愚弄System.Diagnostics.Process WaitForExit()的主要内容,如果未能解决你的问题,请参考以下文章