2016-09-18 2 views
0

linux pipeでコードを書いていて、理解できません。なぜprintfs(1)かexec(2)だけが親プロセスの入力に行くのですか?私がexecにコメントすると、printfはうまく動作します。コメントを解除する場合、唯一の "LS" Execがコメントしたときに出力がLinuxパイプとexecのstdoutが一緒に動作しないのはなぜですか?

int main(void) 
{ 
    int fd[2], pid; 
    if (pipe(fd) != 0) return 1; 
    if ((pid = fork()) == -1) return 1; 
    if (pid == 0) // child 
    { 
     close(STDOUT_FILENO); 
     dup2(fd[1], STDOUT_FILENO); 

     close(fd[0]); 
     close(fd[1]); // */ 

     printf("hello\n"); // (1) 
     printf("hello2\n"); 

     // execl("/bin/ls", "ls", NULL); // (2) 

     printf("exec not executed\n"); 
    } 
    else 
    { 
     close(STDIN_FILENO); 
     dup2(fd[0], STDIN_FILENO); 

     close(fd[0]); 
     close(fd[1]); 

     char buf[100]; 

     while(gets(buf) != NULL) 
      printf("message: %s\n", buf); 
    } 
} 

出力を示す:

メッセージ:こんにちは
メッセージ:hello2
メッセージ:

を実行しないExecのexecはコメントしていません:

メッセージ:FILT1
メッセージ:filt1.d
....その他のファイルは
メッセージ:メイク
メッセージ:デフォルトではobjects.mk

+0

ケースごとにプログラムの正確な出力を表示してください。 「親プロセスの入力にはexec(2)だけが行く」という意味は明確ではありません。 – kaylum

答えて

3

は、完全に出力バッファはstdio (バッファされていないstderrを除く)。したがって、パイプへの出力はバッファされています。

execl()に電話すると、現在のプロセスのメモリは破棄され、ロードするプログラムに置き換えられます。これにより、stdio出力バッファは破棄されるため、パイプに書き込まれることはありません。

簡単な解決策は、を呼び出してexecl()を呼び出すことです。

+0

はい、本当にバッファリングしています:) fflushが追加され、printfとexecからすべてのメッセージが届きました。 ありがとう! – Alexey

関連する問題