愚弄System.Diagnostics.Process WaitForExit()

时间:2014-01-05 03:36:41

标签: c# python process mono system.diagnostics

有一个程序(c#)通过System.Diagnostics.Process启动我的脚本,然后在其上调用WaitForExit()。脚本(在这种情况下是python,但可能是任何东西)然后生成子进程并退出。我希望程序能够继续,但它会一直挂起,直到子进程退出。

我已经尝试了许多启动子进程的方法,从python的os.fork到编写shell脚本包装器,但是每个方法都会导致程序挂起。我无法更改c#程序的代码,我需要对子进程做什么才能让程序继续运行?

注意:我不知道它是否重要,但c#程序在ubuntu上运行单声道。

编辑:在调用WaitForExit之前进一步检查c#代码后,会出现while (!process.StandardOutput.EndOfStream)循环,这可能是问题吗?

2 个答案:

答案 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(或者setpgrpfork之后,你应该完成。

答案 1 :(得分:0)

WaitForExit似乎挂在打开的stdout / stderr上。我使用此脚本使脚本异步:

#!/bin/bash

~/foo.py "$@" >&- 2>&- &

希望这可以帮助下一个人来。