質問: C言語のシステムコール(fork,exec,pipe,dup)を使って、 標準入力を受け取って標準出力するプログラムを子プロセスで起動させて、 出力を親プロセスの標準入力につなげて、 親プロセスで標準
回答: 仕様矛盾があるような、ないような。 可能な構成としては以下の形になります。 1標準入力は子プロセスの持ち物になる 2標準出力は親プロセスの持ち物のまま 3子の標準出力は書込みパイプと差し替え 4親の標準入力は読込みパイプと差し替え 5標準エラー出力は、減給されていないので無視 ※起動後にCtrl+Cすると親がゾンビになります。 止めたい場合は親プロセスのpidを指定してkillしてください。 それぞれのシステムコールの特性は理解できていますか? ・fork=プロセスを複製する ・exec=プロセスを複製したあと、指定ファイルを実行する ・pipe=無名パイプを作成する ・dup=開いているファイル記述子を複製する forkすると子プロセスはすべてのファイル記述子(標準入出力を含む)を親プロセスから引き継ぎます。つまり、子でputsすると親のputsと同じところ(=コンソール)に出力されます。子でgetsすると親のgetsと標準入力の取り合いになります。取り合いなので子で取ったら親は取れませんし、親が取ったら子は取れません。 execすると現在のプロセス空間に、指定されたファイルの実行コードが展開されます。ファイル記述子は原則としてそのまま引き継がれます。openのオプションでclose on execしてない限りは。 pipeは書込みと読込みのファイル記述子を作成するシステムコールです。 dupは指定されたファイル記述子を複製します。質問されている機能を実現するには、複製後のファイル記述子も指定できるdup2のが使い勝手が良いと思います。 enum pipe_mode { READ, WRITE }; pid_t child_pid; int pipe_fd[2]; const char *line; /*無名パイプ作成*/ if (pipe(pipe_fd, 0)) { perror("pipe failed.\n"); return -1; } /*forkでプロセス分岐*/ if((child_pid = fork()) == -1) { /*プロセス生成失敗*/ perror("fork failed.\n"); return -1; } else if (child_pid){ /*親プロセスの処理*/ dup2(pipe_fd[READ], STDIN_FILENO); } else { /*子プロセスの処理*/ dup2(pipe_fd[WRITE], STDOUT_FILENO); } /*主処理*/ for(;;) { line = gets(); puts(line); }