2017-02-14 5 views
0

Я пытаюсь написать программу на C++, которая запустит новый процесс (какой-то скрипт, программа, команда), такой как daemon, и получит некоторую информацию от него (stdout). Я пытаюсь использовать popen(). Но подпроцесс завершается, когда основная программа завершена. Я не знаю, имеет ли C++ что-то простое в использовании, как Python (подпроцессор). Существует мой код:Подпроцессное сообщение. C++

#include <stdio.h> 
#include <iostream> 

using namespace std; 

int main(int argc, char *argv[]) { 
    FILE *in; 
    char buff[512]; 
    in = popen(argv[1], "r"); 
    fgets(buff, sizeof(buff), in); 
    cout << buff; 
} 

P.S: & в конце исполнительной команды не помогает.

+1

Добавить, что вход ('ARGV [1]') было то, что выход ('buff') было и то, что вы хотели вывод быть. Это поможет воспроизвести проблему. – Matt

+0

Я бы сказал, что это не проблема связи. Когда родительский процесс останавливается, его дочерние процессы также прекращаются, если только они не принимают превентивные меры. Это стандартное поведение, ничего особенного в C/C++. Если ваш родительский процесс читается с 'in' до завершения дочернего процесса, это разрешит эту первую проблему. – Rene

+0

Вы также можете ограничить теги для вашего вопроса операционными системами POSIX или Linux или любой другой ОС, на которую вы нацеливаете (например, Microsoft Windows имеет другой API для запуска дочернего процесса) – roalz

ответ

1

Справочник по POPEN функции: http://man7.org/linux/man-pages/man3/popen.3.html

Выдержка:
"POPEN() функция открывает процесс, создавая трубу, разветвление, и вызов оболочки"

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

Ваш код также отсутствует pclose(in) перед выходом.

См. Также this other post on StackOverflow.

1

fgets не дожидается завершения подпроцесса и popen.

Вам нужно не читать до конца in:

while (fgets(buff, sizeof(buff), in)) 
{ 
    cout << buff; 
} 
Смежные вопросы