2017-04-24 9 views
0

サブプロセスが読み込んだファイルの代わりに匿名パイプを使用しようとしています。私が抱えている問題は、「ファイル」(パイプ)の終わりに達していないことを認識していないため、サブプロセスがハングすることです。作品の上に与えられたとしてpopen with/dev/fd/n匿名パイプがサブプロセスをハングする

#include <stdio.h> 
#include <unistd.h> 
#include <sys/fcntl.h> 

int main() 
    { 
    int pipefd[2]; 
    pipe(pipefd); 
    fcntl(pipefd[0], F_SETFL, O_NONBLOCK); // necessary? 

    char cmd[128]; 
    snprintf(cmd, sizeof(cmd), "cat /dev/fd/%i", pipefd[0]); 
    printf("Command: %s\n", cmd); 

#if 1 
    // This works 
    write(pipefd[1], "line1\n", 6); 
    write(pipefd[1], "line2\n", 6); 
    write(pipefd[1], "line3\n", 6); 
    close(pipefd[1]); 
#endif 

    FILE* fp; 
    if ((fp = popen(cmd, "r")) != NULL) 
    { 
// fcntl(fileno(fp), F_SETFL, O_NONBLOCK); // causes SIGPIPE 

#if 0 
    // This doesn't work 
    write(pipefd[1], "line1\n", 6); 
    write(pipefd[1], "line2\n", 6); 
    write(pipefd[1], "line3\n", 6); 
    close(pipefd[1]); 
#endif 

    char buffer[1024]; 
    while (fgets(buffer, sizeof(buffer), fp) != NULL) 
     printf("%s", buffer); 
    printf("retcode: %i\n", pclose(fp)); 
    } 

    close(pipefd[0]); 

    return 0; 
    } 

コード:ここで

は私がやっているのいくつかのサンプルコードです。その中で私はパイプを作成し、パイプの読み込み側を使ってコマンドを作成します。この場合は catです。作業バージョンでは、次にパイプの書き込み側にデータを書き込みます popenを使用してサブプロセスを開始し、終了するまでサブプロセスからstdoutを読み取ります。

#if 0ブロックを参照)の作成後に、のパイプへの書き込みを移動する必要があります。最終的には、別のスレッドで終了します。ただし、popenコールの後に切り替えると、サブプロセスが終了(ハングアップ)せず、理由がわかりません。

私はさまざまなストリームを非ブロック化しようとしましたが、サブプロセスストリームでこれを行うと、SIGPIPEエラーが発生するだけです。

誰でもこの方法を知っていますか?

ありがとうございます!

+1

popenを実行する前にpipefd [1]のFD_CLOEXECフラグを設定します。 –

+0

すばらしい!ありがとう!!あなたはその答えをしたいと思いますし、私はそれをマークするでしょう! –

答えて

0

後の対popenの前に

write(pipefd[1], "line1\n", 6); 
write(pipefd[1], "line2\n", 6); 
write(pipefd[1], "line3\n", 6); 
close(pipefd[1]); 

を行うとの違いはこれです:popenのが呼ばれたときpipefd[1]が開いている場合は、フォーク/ execedプロセスはまた、それが開いています。そのプロセスがpipefd[0]から読み取ると、パイプの書き込み側の記述子が開いたままなので、EOFは表示されません。このため

一つの修正ははpopenする

fcntl(pipefd[1], F_SETFD, fcntl(pipefd[1], F_GETFD) | FD_CLOEXEC); 

前のコールにそのファイルディスクリプタのclose-on-execフラグを設定することです。

関連する問題