0

自己学習の目的で、2 つのプログラムをパイプで接続したいと考えています。最初のプログラムは入力を受け取り、それを上にして画面に出力します。この例では、最初のプログラムは実行されますが、入出力はできません。結果を得るために、2 番目のプログラムでパイプの close() 関数をどのように変更する必要があるか。

4

1 に答える 1

1

書き込み直後に出力パイプを閉じるか、各文字書き込み後に最初のプログラムを fflush(stdout) に変更します (std(in|out) のバッファリングの性質のため、2 番目のプログラムは読み取りでスタックし、最初のプログラムは EOF を取得しなかったため入力を待機します- 2 番目のプログラムからの close() が最初のプログラムに EOF を送信し、最初のプログラムが終了し、終了時に stdout が自動的にフラッシュされます)。

int main(int argc, char** argv) {
  pid_t pid;
  int fi[2];
  int fo[2];

  char c;

  if (pipe(fi) < 0)
    perror("pipe");
  if (pipe(fo) < 0)
    perror("pipe");

  switch ( fork() ) {
  case -1:
    exit(1);
  case 0:
    dup2(fi[0], STDIN_FILENO);
    close(fi[1]);
    dup2(fo[1], STDOUT_FILENO);
    close(fo[0]);
    execlp("pipes1", "pipes1",(char *)NULL);

  default:
    close(fi[0]);
    close(fo[1]);
    break;
  }

  write(fi[1], "t", 1);
  close(fi[1]);
  read(fo[0], &c, 1);
  printf("%c\n", c);
  close(fo[0]);

  return 0;
}
于 2012-04-25T10:54:34.530 に答える