2017-02-14 6 views
0

私はデーモンのような新しいプロセス(スクリプト、プログラム、コマンド)を起動し、そこからいくつかの情報(stdout)を取得するC++プログラムを作成しようとしています。私は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:エグゼクティブコマンドの最後に&を助けていません。 popenの機能のため

+1

入力が( 'ARGV [1]')何であったかを追加、出力( 'buff'が)何をしたし、あなたに出力を望んでいたものをさあ。それは問題を再現するのに役立ちます。 – Matt

+0

これは通信上の問題ではないと言います。親プロセスが停止すると、予防処置を講じない限り子プロセスも停止されます。これは標準的な動作であり、C/C++固有のものはありません。子プロセスが終了するまで、親プロセスが 'in'から読み込んだ場合、これはこの最初の問題を解決します。 – Rene

+0

問題のタグをPOSIXオペレーティングシステムやLinuxなどの対象とする対象にすることもできます(つまり、Microsoft Windowsには子プロセスを実行するAPIが異なります) – roalz

答えて

1

リファレンス:http://man7.org/linux/man-pages/man3/popen.3.html

抜粋:
"のpopen()関数は、パイプを作成をフォークし、シェルを呼び出すことによって、プロセスを開きます。"

フォークメカニズムのおかげで、(呼び出し元の)プロセスが終了すると、その子プロセス(呼び出されたプロセス)も少なくともデフォルトの動作として停止されると思います。
子プロセスが終了するまで、パイプからの読み取りを続けて(呼び出し元プロセスの実行を維持する)1つの方法があります。

終了する前にコードにもpclose(in)がありません。

this other post on StackOverflowも参照してください。

1

fgetsサブプロセスが完了するまで待機せず、どちらもpopenを実行しません。

あなたはinの最後まで読む必要があります:

while (fgets(buff, sizeof(buff), in)) 
{ 
    cout << buff; 
} 
関連する問題