2015-12-14 5 views

答えて

5

これらは、シェルの|と同等の機能を実装するには十分ではありません。pipe(2)の呼び出しでは全く同じではありません。

pipe(2)は、2つのファイル記述子(読み取り終了と書き込み終了)を作成します。しかし、|の機能を実装するにはそれ以上のことが必要です。パイプを作成する

典型的な配列は、このように書きます:

1)pipe(2)を使用して読んで終了し、書き込み終了を作成します。

2)fork()を使用して子プロセスを作成します。

3)親プロセスと子プロセスは、dup2()を使用してファイル記述子を複製します。

4)どちらのプロセスも、それぞれパイプの一端(各プロセスが使用しないパイプの一端)を閉じます。

5)1つはパイプに書き込み、もう1つはパイプから読み取ります。

これを示す簡単な例を考えてみましょう。この場合、引数としてファイル名を渡し、親プロセスは子によってcatというファイルをgrepsします。

#include <stdio.h> 
#include <unistd.h> 

int main(int argc, char **argv) 
{ 
    int pipefd[2]; 
    int pid; 

    char *cat_args[] = {"cat", argv[1], NULL}; 
    char *grep_args[] = {"grep", "search_word", NULL}; 

    pipe(pipefd); 
    pid = fork(); 

    if (pid != 0) 
    { 
     dup2(pipefd[0], 0); 
     close(pipefd[1]); 
     execvp("grep", grep_args); 
    } 
    else 
    { 
     dup2(pipefd[1], 1); 
     close(pipefd[0]); 
     execvp("cat", cat_args); 
    } 
} 

これはシェル上

cat file | grep search_word 

を行うことと等価です。

+0

なぜ重複が作成されますか?私たちは複製せずにデータを書き込んだり読み込んだりできませんか? –

+1

すべての親子プロセス通信で厳密には必要ない( 'dup2()')。あなたは親と子が直接コミュニケーションをとることができます。たとえば、親は 'write(2)'をパイプの書き込み側に、子は 'read(2)'を読み込み側から読み込むことができます。 –

+0

@PsAkshay実行されたgrepとcatはpipefdのものではなく、0と1からのみ読み書きできます。 –

6

シェルパイプ|は、pipe(2)dup2(2)システムコールを使用して実装されています。

Unix Pipesを参照してください。 |オペレータ

|

と配管用シェルによって使用

0

pipe(2)システムコールは、シェルの実装であり、それはintenally pipe()システムコールを使用します。

関連する問題