2017-02-14 102 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; 
}