リダイレクション-2(fork,pipe,dup,execlp)

パイプにより,3つのプロセスの標準入出力を結ぶ例題です.

それぞれのパイプは,2つのパイプを作成してから2回 fork を行う方法により作成されています.

リダイレクション-2(fork,pipe,dup,execlp)(list_75.c)
#include <stdio.h>

//-----------------------------------------------------------------
// % man cat | fold -w 60 | tr a-z A-Z
// --> cat のマニュアル内容を60文字で折り返し,小文字を大文字へ
//-----------------------------------------------------------------

int main()
{
    int pfd1[2],pfd2[2];
    int pid1,pid2,status;
    
    if(pipe(pfd1) < 0 || pipe(pfd2) < 0){
        perror("pipe");
        exit(1);
    }
    if((pid1 = fork()) < 0){
        perror("fork");
        exit(1);
    }

    if(pid1 == 0){ // child
        close(pfd1[0]);
        close(1);
        dup2(pfd1[1],1);
        close(pfd1[1]);
        execlp("man","man","cat",NULL);
    } else { // parent
        close(pfd1[1]);
        close(0);
        dup2(pfd1[0],0);
        close(pfd1[0]);
        if((pid2 = fork()) < 0){
            perror("fork");
            exit(1);
        }
        if(pid2 == 0){ // child
            close(pfd2[0]);
            close(1);
            dup2(pfd2[1],1);
            close(pfd2[1]);
            execlp("fold","fold","-w","60",NULL);
        } else {
            close(pfd2[1]);
            close(0);
            dup2(pfd2[0],0);
            close(pfd2[0]);
            execlp("tr","tr","a-z","A-Z",NULL);
        }
    }

    return 0;
}

実行結果
Gami[484]% ./list_76.exe
CAT(1)                          USER COMMANDS
           CAT(1)



NAME
       CAT - CONCATENATE FILES AND PRINT ON THE STANDARD OUT
PUT

SYNOPSIS
       CAT [OPTION] [FILE]...

DESCRIPTION
       CONCATENATE FILE(S), OR STANDARD INPUT, TO STANDARD O
UTPUT.

       -A, --SHOW-ALL
              EQUIVALENT TO -VET

       -B, --NUMBER-NONBLANK
              NUMBER NONBLANK OUTPUT LINES

       -E     EQUIVALENT TO -VE

       -E, --SHOW-ENDS
              DISPLAY $ AT END OF EACH LINE

       -N, --NUMBER
              NUMBER ALL OUTPUT LINES

       -S, --SQUEEZE-BLANK
              NEVER MORE THAN ONE SINGLE BLANK LINE

       -T     EQUIVALENT TO -VT

       -T, --SHOW-TABS
              DISPLAY TAB CHARACTERS AS ^I

       -U     (IGNORED)

       -V, --SHOW-NONPRINTING
              USE ^ AND M- NOTATION, EXCEPT FOR LFD AND TAB

       --HELP DISPLAY THIS HELP AND EXIT

       --VERSION
              OUTPUT VERSION INFORMATION AND EXIT

       WITH NO FILE, OR WHEN FILE IS -, READ STANDARD INPUT.

AUTHOR
       WRITTEN BY TORBJORN GRANLUND AND RICHARD M. STALLMAN.

REPORTING BUGS
       REPORT BUGS TO .

COPYRIGHT
       COPYRIGHT (C) 2004 FREE SOFTWARE FOUNDATION, INC.
       THIS  IS  FREE SOFTWARE; SEE THE SOURCE FOR COPYING C
ONDITIONS.  THERE
       IS NO WARRANTY; NOT EVEN FOR MERCHANTABILITY OR FITNE
SS FOR A PARTICU-
       LAR PURPOSE.

SEE ALSO
       THE  FULL DOCUMENTATION FOR CAT IS MAINTAINED AS A TE
XINFO MANUAL.  IF
       THE INFO AND CAT PROGRAMS ARE PROPERLY INSTALLED  AT
 YOUR  SITE,  THE
       COMMAND

              INFO COREUTILS CAT

       SHOULD GIVE YOU ACCESS TO THE COMPLETE MANUAL.



CAT (COREUTILS) 5.2.1             MARCH 2004
           CAT(1)
Gami[485]%
inserted by FC2 system