0

私は次のようなLinuxコマンドを実行するCプログラムを書いています。

$ cat / etc / passwd | カット-f1-d:| 選別

子が完了するのを待っている間、1人の子だけが成功して終了します。「実行中の並べ替え」を表示してコードがハングする

#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>
#include <fcntl.h>
#include <limits.h>

int main()
{
  int i,fd1[2],fd2[2],status,listpid[3];
  pid_t child;
  pipe(fd1);
  pipe(fd2);

  for(i=0; i< 3; i++)
  {
    printf("\ncreating child\n");
    if((child = fork()) == -1)
    {
      perror("fork");
      exit(EXIT_FAILURE);

    }
    else if(child == 0)
    {
      if(i == 0)
      {
    close(1); dup(fd1[1]);
    close(fd1[0]);
    close(fd1[1]);
    printf("\nrunning cat /etc/passwd\n");
    fflush(stdout);
    execlp("cat","cat","/etc/passwd", (char *)NULL);
    exit(EXIT_SUCCESS);

      }
      else if(i == 1)
      {
    close(0); dup(fd1[0]);
    close(fd1[1]);
    close(fd1[0]);
    close(1); dup(fd2[1]);
    close(fd2[1]);
    close(fd2[0]);
    printf("\nrunning cut -f1 -d:\n");
    fflush(stdout);
    execlp("cut","cut","-f1","-d:", (char *)NULL);
    exit(EXIT_SUCCESS);

      }
      else if(i == 2)
      {
    close(0); dup(fd2[0]);
    close(fd2[1]);
    close(fd2[0]);
    close(fd1[0]);
close(fd1[1]);
    printf("\nrunning sort\n");
    fflush(stdout);
    execlp("sort","sort", (char *)NULL);
    exit(EXIT_SUCCESS);

      }

    }
    else
    {
      listpid[i]=child;
    }

  }

  close(fd1[0]);
  close(fd1[1]);
  close(fd2[0]);
  close(fd2[1]);

  for(i = 0; i < 2; i++) 
  {
    waitpid(listpid[i], &status, 0);

    if(WIFEXITED(status)) 
    {
      printf("\n[%d] TERMINATED (Status: %d)\n",listpid[i], WEXITSTATUS(status));

    }

  }
  exit(EXIT_SUCCESS);

}
4

2 に答える 2

1

それが「ハング」する理由sortは、より多くの入力を待っているためです。入力パイプが閉じられるまで、何も出力されません。パイプに問題がある可能性がありますが(とからの戻り値を確認する必要がありますpipedup、何も表示されません。

私の推測では、それcutは終了していません。繰り返しになりますが、最も可能性の高い理由は、入力パイプが閉じられていないことです。それで、それはどこに開いていますか?

catそれが終了しなかった理由がないので、それはプロセスで開かれません。

すべての記述子を注意深く閉じたため、親プロセスでは開かれません。

cutfd1の書き込み終了を閉じるため、プロセスでは開かれません。

それはsortプロセス自体を残します:それはまだfd1の記述子を開いています!

したがって、sortがfd1に何も書き込まない場合でも、終了をsort待機しているためにハングし、待機しているためにハングします。cutcutsort

3番目の子でfd1を閉じるか、各パイプがそれらを必要とする子にのみ存在するように調整する必要があります。

それはとにかく私の理論です。

于 2012-11-30T10:06:22.600 に答える
0

子2のパイプを閉じる必要がありますfd1。そうしないと、子1がハングして、より多くの入力を待つことになります。

別の問題として、waitpidループにはループ条件i < 3ではなくループ条件が必要i < 2です。

于 2012-11-30T10:00:25.507 に答える