有一个程序(c#)通过System.Diagnostics.Process启动我的脚本,然后在其上调用WaitForExit()。脚本(在这种情况下是python,但可能是任何东西)然后生成子进程并退出。我希望程序能够继续,但它会一直挂起,直到子进程退出。
我已经尝试了许多启动子进程的方法,从python的os.fork到编写shell脚本包装器,但是每个方法都会导致程序挂起。我无法更改c#程序的代码,我需要对子进程做什么才能让程序继续运行?
注意:我不知道它是否重要,但c#程序在ubuntu上运行单声道。
编辑:在调用WaitForExit之前进一步检查c#代码后,会出现while (!process.StandardOutput.EndOfStream)
循环,这可能是问题吗?
答案 0 :(得分:0)
执行此操作的最简单方法是让子进程setsid()
删除与您的所有连接 - 它将成为新会话的会话负责人,并成为新进程组的组长只需一次通话,即可与您的stdio分离。
如果您无法修改子进程的代码,可以通过显式fork
,然后调用setsid
,然后调用exec
来代替各种常用的清洁方法,如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
一个孩子并在那个孩子中继续使用相同的脚本,在这种情况下你只需添加setsid
(或者setpgrp
在fork
之后,你应该完成。
答案 1 :(得分:0)
WaitForExit似乎挂在打开的stdout / stderr上。我使用此脚本使脚本异步:
#!/bin/bash
~/foo.py "$@" >&- 2>&- &
希望这可以帮助下一个人来。