2014-01-05 5 views
2

Существует программа (C#), которая запускает мой скрипт через System.Diagnostics.Process, а затем вызывает WaitForExit(). Скрипт (python в этом случае, хотя может быть любым) затем порождает дочерний процесс и завершает работу. Я ожидал, что программа продолжит работу, но она зависает, пока дочерний процесс не завершится.Fooling System.Diagnostics.Process WaitForExit()

Я пробовал много способов запуска подпроцессов, от os.fork от python до написания оболочки оболочки оболочки, но каждый метод заставляет программу зависать. Я не могу изменить код программы C#, что мне нужно сделать для дочернего процесса, чтобы программа продолжалась?

Примечание: Я не знаю, имеет ли значение, но программа C# работает в моно на ubuntu.

Редактировать: После дальнейшего пересмотра кода C# прямо перед вызовом WaitForExit существует цикл while (!process.StandardOutput.EndOfStream), может возникнуть проблема?

+0

У вас есть контроль над кодом подпроцесса, или вам нужно сделать это из своего среднего скрипта Python? – abarnert

+0

У меня есть контроль над обоими. На самом деле мой метод os.fork использовал один скрипт Python. – RedHatter

+0

ОК, это должно быть еще проще ... позвольте мне отредактировать ответ. – abarnert

ответ

0

Простейший способ сделать это - создать дочерний процесс setsid(), который удалит все ваши подключения к вам - он станет лидером сеанса нового сеанса и лидером группы новой группы процессов и отделится от вашего stdio, всего за один звонок.

Если вы не можете изменить код дочернего процесса, вы можете сделать это из ваших родителей Python, явно fork Инг, то вызов setsid, затем exec ING, вместо различных обычных чистых методов, как subprocess. Как это:

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 ING ребенка и продолжается тот же сценарий в этом ребенке, в этом случае вы можете просто добавить setsid (или, может быть setpgrp) после fork и вы должны быть сделанный.

+0

Я пробовал что-то подобное (это не сработало), см. Https://gist.github.com/RedHatter/8264094, будет ли это делать то же самое? – RedHatter

+0

Да, это должно сработать; не знаю, почему это не так. Возможно, вам нужно синхронизировать что-то, чтобы родитель мог дождаться, пока ребенок отделится до выхода? – abarnert

+0

Хм ... Я не совсем уверен, как это сделать. – RedHatter

Смежные вопросы