9

パイピングをサポートする Linux シェルを実装しようとしています。私はすでに簡単なコマンド、バックグラウンドで実行されているコマンド、リダイレクトを実行しましたが、パイプがまだありません。

私はすでにそれについて読んで、コードのスニペットを見ましたが、まだ実用的な解決策を整理することができませんでした.

私がこれまでに持っているもの:

int fd[2];

pipe(fd);

pid_t pid = fork();

if (pid == -1)  
   return -1;  

if (pid == 0)  
{  
   close(fd[1]); //close write to pipe, in child
   execlp("cat", "cat", "names.txt", NULL);
}

else
{
   close(fd[0]); //close read from pipe, in parent
   execlp("sort", "sort", NULL);
}  

おそらくおわかりのように、私は初心者のプログラマーです。何かをプログラミングしているときは、あまりよく知りませんが、これは明らかにそうであり、非常に簡単で具体的なものから始めて、そこから構築するのが好きです。

したがって、パイプラインで 3 つ以上の異なるコマンドを実装できるようになる前に、「ls names.txt | sort」または類似のものを計算できるようにしたいと考えています。この場合、names.txt はアルファベット順に並べられていない名前のファイルです。

コードを更新しましたが、まだ機能しません。

ありがとう。

4

2 に答える 2

11

1 つの子の stdout をパイプの書き込み側に置き換え、もう 1 つの子の stdin を読み取り側に置き換える必要があります。

if (pid == 0)  
{  
   close(fd[0]); //close read from pipe, in parent
   dup2(fd[1], STDOUT_FILENO); // Replace stdout with the write end of the pipe
   close(fd[1]); // Don't need another copy of the pipe write end hanging about
   execlp("cat", "cat", "names.txt", NULL);
}
else
{
   close(fd[1]); //close write to pipe, in child
   dup2(fd[0], STDIN_FILENO); // Replace stdin with the read end of the pipe
   close(fd[0]); // Don't need another copy of the pipe read end hanging about
   execlp("sort", "sort", NULL);
} 
于 2010-04-18T10:01:02.903 に答える
5

pipe()標準ライブラリの呼び出しを調べてください。これは、パイプを作成するために使用されます。もちろん、子プロセスがファイル記述子を適切に継承するためには作業の一部を行う必要があります。fork()

への引数の順序にも注意してくださいdup2()

int dup2(int oldfd, int newfd);

dup2() は newfd を oldfd のコピーにし、必要に応じて最初に newfd を閉じます

于 2010-04-17T19:07:40.157 に答える