ΠΠΎΠ³Π΄Π° Π»Π΅Π²ΡΠΉ ΠΏΠΎΡΠΎΠΌΠΎΠΊ Π·Π°Π²Π΅ΡΡΠ°Π΅Ρ ΡΠ°Π±ΠΎΡΡ, ΠΎΠ½ Π·Π°ΠΊΠ°Π½ΡΠΈΠ²Π°Π΅ΡΡΡ. Π‘ΠΈΡΡΠ΅ΠΌΠ° ΠΏΠΎΡΠ»Π΅ ΡΡΠΎΠ³ΠΎ Π·Π°ΠΊΡΡΠ²Π°Π΅Ρ Π²ΡΠ΅ Π΅Π³ΠΎ Π΄Π΅ΡΠΊΡΠΈΠΏΡΠΎΡΡ ΡΠ°ΠΉΠ»ΠΎΠ². ΠΠΎΠ³Π΄Π° ΡΡΠΎ ΡΠ»ΡΡΠ°Π΅ΡΡΡ, ΠΏΡΠ°Π²ΡΠΉ ΠΏΠΎΡΠΎΠΌΠΎΠΊ ΠΏΠΎΠ»ΡΡΠ°Π΅Ρ Π² ΠΊΠΎΠ½Π΅ΡΠ½ΠΎΠΌ ΡΡΠ΅ΡΠ΅ ΡΠ²Π΅Π΄ΠΎΠΌΠ»Π΅Π½ΠΈΠ΅ ΠΊΠΎΠ½ΡΠ° ΡΠ°ΠΉΠ»Π° ΠΈ ΡΠΎΠΆΠ΅ ΠΌΠΎΠΆΠ΅Ρ Π·Π°Π²Π΅ΡΡΠΈΡΡ ΡΠ°Π±ΠΎΡΡ ΠΈ Π²ΡΠΉΡΠΈ.
Π‘Π»Π΅Π΄ΡΡΡΠ°Ρ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠ°,
ch09-pipeline.c$ <b>echo hi there | sed s/hi/hello/g</b>hello thereΠΠΎΡ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠ°:
1 Β /* ch09-pipeline.c --- ΠΎΡΠ²Π΅ΡΠ²Π»ΡΠ΅Ρ Π΄Π²Π° ΠΏΡΠΎΡΠ΅ΡΡΠ° Π² ΠΈΡ
ΡΠΎΠ±ΡΡΠ²Π΅Π½Π½ΡΠΉ ΠΊΠΎΠ½Π²Π΅ΠΉΠ΅Ρ.2Β Β Β Β ΠΠ»Ρ ΠΊΡΠ°ΡΠΊΠΎΡΡΠΈ ΠΏΡΠΎΠ²Π΅ΡΠΊΠ° ΠΎΡΠΈΠ±ΠΎΠΊ ΡΠ²Π΅Π΄Π΅Π½Π° ΠΊ ΠΌΠΈΠ½ΠΈΠΌΡΠΌΡ. */34Β #include <stdio.h>5Β #include <errno.h>6Β #include <sys/types.h>7Β #include <sys/wait.h>8 Β #include <unistd.h>910 int pipefd[2];1112 extern void left_child(void), right_child(void);1314 /* main --- ΠΏΠΎΡΠΎΠΆΠ΄Π΅Π½ΠΈΠ΅ ΠΏΡΠΎΡΠ΅ΡΡΠΎΠ² ΠΈ ΠΎΠΆΠΈΠ΄Π°Π½ΠΈΠ΅ ΠΈΡ
Π·Π°Π²Π΅ΡΡΠ΅Π½ΠΈΡ */1516 int main(int argc, char **argv)17 {18Β pid_t left_pid, right_pid;19Β pid_t ret;20Β int status;2122Β if (pipe(pipefd) < 0) { /* ΡΠΎΠ·Π΄Π°ΡΡ ΠΊΠ°Π½Π°Π» Π² ΡΠ°ΠΌΠΎΠΌ Π½Π°ΡΠ°Π»Π΅ */23Β Β perror("pipe");24Β Β exit(1);25Β }2627Β if ((left_pid = fork()) < 0) { /* ΠΏΠΎΡΠΎΠΆΠ΄Π΅Π½ΠΈΠ΅ Π»Π΅Π²ΠΎΠ³ΠΎ ΠΏΠΎΡΠΎΠΌΠΊΠ° */28Β Β perror("fork");29Β Β exit(1);30Β } else if (left_pid == 0)31 Β left_child();3233Β if ((right_pid = fork()) < 0) { /* ΠΏΠΎΡΠΎΠΆΠ΄Π΅Π½ΠΈΠ΅ ΠΏΡΠ°Π²ΠΎΠ³ΠΎ ΠΏΠΎΡΠΎΠΌΠΊΠ° */34Β Β perror("fork");35Β Β exit(1);36Β } else if (right_pid == 0)37Β right_child();3839Β close(pipefd[0])); /* Π·Π°ΠΊΡΡΡΡ ΡΠΎΠ΄ΠΈΡΠ΅Π»ΡΡΠΊΠΈΠ΅ ΠΊΠΎΠΏΠΈΠΈ ΠΊΠ°Π½Π°Π»Π° */40Β close(pipefd[1]);4142Β while ((ret = wait(&status)) > 0) { /* wait for children */43Β Β if (ret == left_pid)44Β Β Β printf("left child terminated, status: %x\n", status);45Β Β else if (ret == right_pid)46Β Β Β printf("right child terminated, status: %x\n", status);47Β Β else48Β Β Β printf("yow! unknown child %d terminated, status %x\n",49Β Β Β Β ret, status);50Β Β }5152Β return 0;53 }Π‘ΡΡΠΎΠΊΠΈ 22β25 ΡΠΎΠ·Π΄Π°ΡΡ ΠΊΠ°Π½Π°Π». ΠΡΠΎ Π΄ΠΎΠ»ΠΆΠ½ΠΎ Π±ΡΡΡ ΡΠ΄Π΅Π»Π°Π½ΠΎ Π² ΡΠ°ΠΌΠΎΠΌ Π½Π°ΡΠ°Π»Π΅.
Π‘ΡΡΠΎΠΊΠΈ 27β31 ΡΠΎΠ·Π΄Π°ΡΡ Π»Π΅Π²ΠΎΠ³ΠΎ ΠΏΠΎΡΠΎΠΌΠΊΠ°, Π° ΡΡΡΠΎΠΊΠΈ 33β37 ΡΠΎΠ·Π΄Π°ΡΡ ΠΏΡΠ°Π²ΠΎΠ³ΠΎ ΠΏΠΎΡΠΎΠΌΠΊΠ°. Π ΠΎΠ±ΠΎΠΈΡ ΡΠ»ΡΡΠ°ΡΡ ΡΠΎΠ΄ΠΈΡΠ΅Π»Ρ ΠΏΡΠΎΠ΄ΠΎΠ»ΠΆΠ°Π΅Ρ Π»ΠΈΠ½Π΅ΠΉΠ½ΠΎΠ΅ ΠΈΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ Π²Π΅ΡΠ²ΠΈ
main()execΠ‘ΡΡΠΎΠΊΠΈ 39β40 Π·Π°ΠΊΡΡΠ²Π°ΡΡ ΡΠΎΠ΄ΠΈΡΠ΅Π»ΡΡΠΊΡΡ ΠΊΠΎΠΏΠΈΡ ΠΊΠ°Π½Π°Π»Π°.
Π‘ΡΡΠΎΠΊΠΈ 42β50 Π² ΡΠΈΠΊΠ»Π΅ ΠΎΠΆΠΈΠ΄Π°ΡΡ ΠΏΠΎΡΠΎΠΌΠΊΠΎΠ², ΠΏΠΎΠΊΠ°
wait()55 /* left_child --- ΠΎΡΡΡΠ΅ΡΡΠ²Π»ΡΠ΅Ρ ΡΠ°Π±ΠΎΡΡ Π»Π΅Π²ΠΎΠ³ΠΎ ΠΏΠΎΡΠΎΠΌΠΊΠ° */5657 void left_child(void)58 {59Β static char *left_argv[] = { "echo", "hi", "there", NULL };6061Β close(pipefd[0]);62Β close(1);63 Β dup(pipefd[1]);64Β close(pipefd[1]);6566Β execvp("echo", left_argv);67Β _exit(errno == ENOENT ? 127 : 126);68 }6970 /* right_child --- ΠΎΡΡΡΠ΅ΡΡΠ²Π»ΡΠ΅Ρ ΡΠ°Π±ΠΎΡΡ ΠΏΡΠ°Π²ΠΎΠ³ΠΎ ΠΏΠΎΡΠΎΠΌΠΊΠ° */7172 void right_child(void)73 {74 Β static char *right_argv[] = { "sed", "s/hi/hello/g", NULL };7576Β close(pipefd[1]);77Β close(0);78Β dup(pipefd[0]);79Β close(pipefd[0]));8081Β execvp("sed", right_argv);82Β _exit(errno == ENOENT ? 127 : 126);83 }Π‘ΡΡΠΎΠΊΠΈ 57β68 ΡΠ²Π»ΡΡΡΡΡ ΠΊΠΎΠ΄ΠΎΠΌ Π΄Π»Ρ Π»Π΅Π²ΠΎΠ³ΠΎ ΠΏΠΎΡΠΎΠΌΠΊΠ°. ΠΡΠΎΡΠ΅Π΄ΡΡΠ° ΡΠ»Π΅Π΄ΡΠ΅Ρ ΠΏΡΠΈΠ²Π΅Π΄Π΅Π½Π½ΡΠΌ Π²ΡΡΠ΅ ΡΠ°Π³Π°ΠΌ, Π·Π°ΠΊΡΡΠ²Π°Ρ Π½Π΅Π½ΡΠΆΠ½ΡΠΉ ΠΊΠΎΠ½Π΅Ρ ΠΊΠ°Π½Π°Π»Π°, Π·Π°ΠΊΡΡΠ²Π°Ρ ΠΏΠ΅ΡΠ²ΠΎΠ½Π°ΡΠ°Π»ΡΠ½ΡΠΉ ΡΡΠ°Π½Π΄Π°ΡΡΠ½ΡΠΉ Π²ΡΠ²ΠΎΠ΄, ΠΏΠΎΠΌΠ΅ΡΠ°Ρ Ρ ΠΏΠΎΠΌΠΎΡΡΡ
dup()execvp()_exit()execvp()