愚弄System.Diagnostics.Process WaitForExit()

问题描述 投票:2回答:2

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

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

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

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

c# python process mono system.diagnostics
2个回答
0
投票

WaitForExit似乎挂在open stdout / stderr上。我使用这个脚本使我的脚本异步:

#!/bin/bash

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

希望这有助于下一个人的到来。


0
投票

最简单的方法是让子进程setsid(),它将删除它与你的所有连接 - 它成为新会话的会话负责人,以及新进程组的组长,并从你的stdio中删除,一次通话。

如果您无法修改子进程的代码,您可以通过显式forking从Python父代执行,然后调用setsid,然后调用execing,而不是像subprocess这样的各种常用清理器方法。像这样:

pid = os.fork()
if not pid:
    sid = os.setsid()
    os.execv(path, args)

我相信这是对System.Diagnostics.Process很重要的过程组,但我实际上并不知道,所以我认为安全比抱歉更好。如果你想尝试os.setpgrp(),你可以尝试一下。如果有效,你可以实际上spawn / subprocess /等。孩子,然后只是setpgid(pid, pid)


同时,听起来你只是在给孩子做forking并在那个孩子继续相同的剧本,在这种情况下你可以在setsid之后添加setpgrp(或者可能是fork),你应该完成。

© www.soinside.com 2019 - 2024. All rights reserved.