パイプにより,3つのプロセスの標準入出力を結ぶ例題です.
それぞれのパイプは,2つのパイプを作成してから2回 fork を行う方法により作成されています.
#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 |