Получить stdout / stderr разветвленного процесса в подпроцессе

У меня есть программа C, которая вызывает fork()

И у меня есть скрипт Python, который выполняет программу C с помощью

child = subprocess.Popen(command, shell=True, stderr=subprocess.PIPE,stdout=subprocess.PIPE, bufsize=0)

Теперь я могу читать из stdout и stderr с child.stderr.read(1) или child.communicate(), ... Но теперь моя проблема в том, как получить только вывод из разветвленного процесса. Это вообще возможно? Могу ли я получить идентификатор pid как из исходной программы C, так и из fork?

С уважением, большое спасибо :)

Fabian


person samuirai    schedule 26.02.2012    source источник
comment
Это вообще возможно? Нет. Могу ли я получить pid из исходной программы C и вилки? Нет. Этот ребенок принадлежит программе C. Ваш процесс владеет программой C. В настоящее время. Не беспокойтесь о деталях Linux и опишите свою настоящую проблему. Почему ваша программа Python не может запускать тот же подпроцесс, что и программа C?   -  person S.Lott    schedule 26.02.2012
comment
более простой способ может заключаться в использовании другого формата вывода, основной процесс может начинаться с: ParentOutput :, а вывод подпроцесса: ChildOutput :. Тогда вы можете просто игнорировать ParentOutput в своей программе на Python.   -  person springrider    schedule 26.02.2012


Ответы (2)


То, что вы просите, будет сложным и будет невозможно в чистом питоне - вам потребуются некоторые механизмы, специфичные для ОС.

Вы действительно просите о двух вещах:

  • Определите разветвленный процесс по PID родительского процесса
  • Перехват стандарта в / из произвольного процесса

Вероятно, вы могли бы сделать первое, проанализировав / proc, если бы вы были в Linux, последний на самом деле является частью функциональности, подобной отладчику (например, Как процесс может перехватить stdout и stderr другого процесса в Linux?)

Скорее всего, вы захотите изменить способ работы вашей программы C - например, выполнение fork () / демонизации из скрипта python вместо промежуточного кода C позволит вам напрямую получить дочерний процесс.

person kdt    schedule 26.02.2012

Я думаю, что когда вы fork () процесс в C, вы не можете передать какой-либо дескриптор из дочернего процесса обратно родительскому - но, возможно, я ошибаюсь. Вы получаете только PID нового дочернего процесса. Лучше всего открыть канал (с условным именем, например, имя канала содержит PID процесса), а затем вы можете открыть его из любого места.

Наконец, когда вы fork () процесс, он дает вам PID, и вы можете записать PID (двоичный и разветвленный C) в стандартный вывод программы C, например, с разделителем:

cpid = fork();
printf("%d|%d", (int)get_pid(), cpid);

Удачи :)

person airween    schedule 26.02.2012