Получить stdout / stderr разветвленного процесса в подпроцессе - PullRequest
6 голосов
/ 26 февраля 2012

У меня есть программа на 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 ?

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

Fabian

Ответы [ 2 ]

1 голос
/ 26 февраля 2012

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

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

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

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

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

0 голосов
/ 26 февраля 2012

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

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

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

Удачи:)

...