2011-11-28 6 views
2

私はLinuxでCでcat /tmp/txt |grep fooのようなパイプを作る方法を知っていますが、このような複数の連鎖パイプを実装するのに問題があります。 Linuxでpipe()を使用してCでそれを行うには?linuxでpipe()を使ってパイプをつなぎ合わせたもの

更新:私はそれを理解しました。 - さんがabそれらを呼びましょう

enum PIPES { 
    READ, WRITE 
}; 


int filedes[2]; 
    int filedes2[2]; 
    pipe(filedes); 
    pipe(filedes2); 

    pid_t pid = fork(); 
    if (pid == 0) { 
     dup2(filedes[WRITE], 1); 
    char *argv[] = {"cat", "/tmp/1.txt", NULL}; 
     execv("/bin/cat", argv); 
     exit(0); 
    } 
    else { 
     close(filedes[1]); 
    } 

    pid = fork(); 
    if (pid == 0) { 
    dup2(filedes[READ], 0); 
    dup2(filedes2[WRITE], 1); 
     char *argv[] = {"uniq", "-c", NULL}; 
     execv("/usr/bin/uniq", argv);  
    } 
    else { 
     close(filedes2[1]); 
    } 

    pid = fork(); 
    if (pid == 0) { 
     dup2(filedes2[READ], 0); 
     char *argv1[] = {"sort", NULL}; 
      execv("/usr/bin/sort", argv1); 
    } 

    waitpid(pid); 

答えて

1

パイプには2つの終端(読み取りと書き込み)があり、pipe()は指定した配列に2つのファイル記述子を配置します。最初のものは読み取り側、もう一方は書き込み側です。読み取りにuniqの標準入力を接続

  • は、最初のパイプの書き込み側にcatの標準出力を接続し、
  • だから、あなたの例では、次の2本のパイプとを作成します第一パイプの端部、

  • は、第二パイプの読み出し側にsortの標準入力に接続
  • 、第二パイプの書き込み端にuniqの標準出力を接続します。
2

あなたはファイル記述子のペアを取得する:ここでは誰もが今までに同じ質問がある場合はコードです。その後のpipeの呼び出しにより、ファイル記述子cdが得られます。

bcに接続すると、これらの2つのプロセスが連鎖します。もう1組のファイルディスクリプタを作成し、deなどを接続します。

関連する問題