2017-11-21 15 views
1

これは私がやろうとしていることです。親プロセスは2つの子プロセスを作成し、次にstdoutを1つずつstdoutして別のstdinにします。親は5秒待って最初の子を殺します。パイプ内の他の子のstdinへのパイプ

これが私のアプローチです。まずパイプを作成します。次にforkを実行して最初の子(gen in code)を作成し、dup2を使用してpipeのwriteをstdoutにコピーします。 2番目の子の別のフォーク(コードではconsと呼ばれます)、dup2はread endをstdinに複製します。短所はデータを印刷するだけです。親はSIGTERMを最初の子に送り、2番目の子はEOFまで読み込んで、自身の上で閉じます。

私のエラー出力(ここではデバッグに使用)は表示されません。 Genは2つの乱数を生成しますが、consのループは実行されません。だから、私は、短所には何もないと思う。 私はGoogleに相談し、これに続いてHow do I chain stdout in one child process to stdin in another child in C?と言っていたが、私がどんなことをするのか分からなかった。助けていただければ幸いです。おかげ

編集:Windowsの10でのバッシュのgcc -std=c99 -Wall -Werror main.c -o main

コード:

#define _POSIX_SOURCE 
#include <sys/types.h> 
#include <unistd.h> 
#include <stdio.h> 
#include <string.h> 
#include <time.h> 
#include <stdlib.h> 
#include <signal.h> 

#define READ_END 0 
#define WRITE_END 1 
#define BUF_SIZE 10 

int main(int argc, char* argv[]) 
{ 
    pid_t gen, cons; 
    int fd[2]; 

    if (pipe(fd) < 0) { 
     // pipe error 
     exit(1); 
    } 

    gen = fork(); 

    if (gen < 0) { 
     // fork error 
     close(fd[READ_END]); 
     close(fd[WRITE_END]); 
     exit(2); 
    } else if (gen == 0) { 
     // gen child 
     close(fd[READ_END]); 
     time_t t; 
     srand((unsigned)time(&t)); 
     dup2(fd[WRITE_END], STDOUT_FILENO); 
     close(fd[WRITE_END]); 
     while(1) { 
      int a = rand() % 1000; 
      int b = rand() % 1000; 
      printf("gen %d %d\n", a, b); 
      fprintf(stderr, "err, gen %d %d\n", a, b); 
      sleep(1); 
     } 
    } 
    else { 
     cons = fork(); 
     if (cons < 0) { 
       // fork error 
      close(fd[READ_END]); 
      close(fd[WRITE_END]); 
      kill(gen, SIGKILL); 
      exit(2); 
     } else if (cons == 0) { 
      // cons child 
      close(fd[WRITE_END]); 
      dup2(fd[READ_END], STDIN_FILENO); 
      close(fd[READ_END]); 
      char line[BUF_SIZE]; 
      while (fgets(line, sizeof(line), stdin)) { 
       printf("cons received: %s\n", line); 
       fprintf(stderr, "cons lives!\n"); 
      } 
     } else { 
      // parent 
      close(fd[READ_END]); 
      close(fd[WRITE_END]); 
      sleep(5); 
      kill(gen, SIGTERM); 
     } 
    } 
    return 0; 
} 

答えて

1

標準出力をバッファリングデフォルトであるので、あなたの世代の子供は、後に送信するための出力をキューに入れます。だからあなたはメッセージを即時配信するようにするにはfflushにする必要があります:

 ... 
     printf("gen %d %d\n", a, b); 
     fprintf(stderr, "err, gen %d %d\n", a, b); 
     fflush(stdout);    // <= force immediate send 
     sleep(1); 
     ... 
+0

ありがとう –

関連する問題