2012-10-24 4 views
5

外部プログラムを実行するプログラムを作成しようとしています。C++でstderrとstdoutを外部プログラムからキャッチ

私はstdoutをキャッチすることができることを知っている、と私は一緒にstdoutstderrをキャッチすることができますが、私はstderrstdout分離をキャッチすることができます質問はありますか?

例えば、変数STDERRおよびstdoutの変数STDOUTの中のstderrを意味します。私はそれらを分離したいと思う。

また、変数に外部プログラムの終了コードが必要です。

+3

どのようなOSですか?そして、彼らを一緒に捉えるには、どのようなアプローチが分かっていますか? – ybungalobill

+0

私はUbuntuを使用していますが、私は2>&1を使用できることを知っています。しかし、私はそれらを分離してほしい。ありがとう –

+0

この答えを見て:http://stackoverflow.com/a/12839498/1741542 –

答えて

2

Windowsでは、CreateProcessにはスタンダードストリームをキャッチするためにSTARTUPINFOと入力し、GetExitCodeProcess機能を使用して終了ステータスを取得する必要があります。親プロセスは、おそらくforkの代わりexecveを使用するLinux系OS上でhttp://msdn.microsoft.com/en-us/library/windows/desktop/ms682499.aspx

にスタンダール・ストリームをリダイレクトする方法の例があり、そしてフォークプロセスで作業することは別の話です。

WindowsとLinuxのリダイレクトストリームでは、複数のパイプ(各ストリームに1つずつ)を作成し、子プロセスストリームをそのパイプにリダイレクトし、親プロセスがそのパイプからデータを読み取る必要があります。 Linux用の

サンプルコード:

int fd[2]; 

if (pipe(fd) == -1) { 
    perror("pipe"); 
    exit(EXIT_FAILURE); 
} 

pid_t cpid = fork(); 
if (cpid == -1) { 
    perror("fork"); 
    exit(EXIT_FAILURE); 
} 

if (cpid == 0) { // child 
    dup2(fd[1], STDERR_FILENO); 
    fprintf(stderr, "Hello, World!\n"); 
    exit(EXIT_SUCCESS); 
} else { // parent 
    char ch; 
    while (read(fd[0], &ch, 1) > 0) 
     printf("%c", ch); 
    exit(EXIT_SUCCESS); 
} 

EDIT:あなたが他のプログラムからのストリームをキャッチする必要がある場合はは、上記のように第1、第2 fork、同じstrageyを使用 - (上記のコードのように)使用パイプを、その後、execve別progrram子プロセスで、実行終了を待ってからリターンコードをキャッチするために、親プロセスでこのコードを使用:

int status; 
if (waitpid(cpid, &status, 0) < 0) { 
    perror("waitpid"); 
    exit(EXIT_FAILURE); 
} 

あなたはmanページに詳細を見つけることができます,dup2およびwaitpid

関連する問題