0

この Unix コマンドをシミュレートしたい:

cat file.txt | sort | tail -4

テクニックに従いましたが、機能せず、ブロックされたままです。ファイルがある場合は、別のものを使用する必要があるかもしれません。2 つのパイプと 2 つのプロセスを使用し、1 つのプロセスで 2 つの DUP を使用しましたが、これは間違っている可能性があります。

#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <sys/wait.h>

int main()
{
  int p1[2];
  int p2[2];

  if(pipe(p1))
  {
    perror("pipe1");
    exit(0);
  }

  if(pipe(p2))
  {
    perror("pipe2");
    exit(0);
  }

  switch(fork())
  {
    case -1: perror(" fork1 error ");
             exit(0);

    case  0: close(STDOUT_FILENO);
             (void)dup(p1[1]);
             close(p1[1]);
             close(p1[0]);
             execlp("cat", "cat", "file.txt", NULL);
             exit(0);
    default: 
            switch(fork())
            {
              case -1: perror(" fork2 error ");
               exit(0);

              case  0: close(STDIN_FILENO);
                       (void)dup(p1[0]);
                       close(p1[1]);
                       close(p1[0]);

                       close(STDOUT_FILENO);
                       (void)dup(p2[1]);
                       close(p2[1]);
                       close(p2[0]);

                       execlp("sort", "sort", NULL);
                       exit(0);

              default: 
                       wait(NULL);
                       close(STDIN_FILENO);
                       (void)dup(p2[0]);
                       close(p2[0]);
                       close(p2[1]);
                       execlp("tail", "tail", "-4", NULL); 
            }             
  }
}

これは file.txt です:

g
f
d
b
c
a
e
4

1 に答える 1

1

親プロセスはパイプを閉じないp1ため、その子はパイプを読み込もうとします。close(p1[0]); close(p1[1]);の前に追加しexeclp("tail", "tail", "-4", NULL);ます。

また、すべきではない ことに注意してくださいwait(NULL)。これは、file.txt が大きく、パイプ バッファがいっぱいになり始めたときに発生するのを待っている別のハングです。

于 2012-04-29T17:56:31.263 に答える