首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >愚弄System.Diagnostics.Process WaitForExit()

愚弄System.Diagnostics.Process WaitForExit()
EN

Stack Overflow用户
提问于 2014-01-05 03:36:41
回答 2查看 737关注 0票数 2

有一个程序(c#)通过System.Diagnostics.Process启动我的脚本,然后在它上调用WaitForExit()。脚本(在本例中为python,尽管可以是任何内容)然后生成一个子进程并退出。我原以为程序会继续,但它挂起,直到子进程退出。

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

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

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

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-04-03 13:37:28

WaitForExit似乎坚持开放的stdout/stderr。我使用这个脚本来实现我的脚本异步:

代码语言:javascript
复制
#!/bin/bash

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

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

票数 0
EN

Stack Overflow用户

发布于 2014-01-05 03:47:07

最简单的方法是让子进程setsid(),它将删除它与您的所有连接-它将成为一个新会话的会话领导者,一个新进程组的组长,并且在一个调用中与stdio分离。

如果您不能修改子进程的代码,您可以通过显式forking,然后调用setsid,然后调用execing,而不是像subprocess这样的各种常用的更干净的方法,从您的Python父进程中进行修改。如下所示:

代码语言:javascript
复制
pid = os.fork()
if not pid:
    sid = os.setsid()
    os.execv(path, args)

我相信过程组对System.Diagnostics.Process很重要,但我并不确定,所以我觉得安全总比抱歉好。如果你只想尝试os.setpgrp(),你可以试试它。如果这样做有效的话,您实际上可以在spawn/subprocess/etc上使用该子程序,然后在它上只使用setpgid(pid, pid)

同时,听起来您只是在fork中对一个子节点执行相同的脚本,在这种情况下,您可以在fork之后添加setsid (或者setpgrp),然后就可以完成了。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/20929747

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档