2017-02-14 79 views
0

我想写一个C++程序,它将启动新进程(一些脚本,程序,命令)像守护进程,并从它(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()函数通过创建一个管道,分叉,以及调用所述外壳开口的过程”

我认为,由于fork机制,当您的(调用)进程结束时,其子进程(被调用的进程)也会停止,至少作为默认行为。
一种选择是在子流程结束之前继续读取管道(并保持调用者进程正在运行)。

您的代码在退出之前还缺少pclose(in)。请参阅this other post on StackOverflow

1

fgets不等待子流程完成,也没有popen

你需要阅读,直到in结束:

while (fgets(buff, sizeof(buff), in)) 
{ 
    cout << buff; 
}