[<<Previous Entry] [^^Up^^] [Next Entry>>] [Menu] [About The Guide]
 Программные каналы - Пример

Этот  пример   иллюстрирует   двунаправленные   каналы,   использующие
реализацию pipe(2)  в SVR4.  Эта программа посылает текст порожденному
процессу, который  распечатывает текст,  полученный  от  родительского
процесса. Порожденный  процесс также посылает сообщение родителю через
тот же самый канал, из которого он прочитал сообщение от родителя.

12-14     Здесь  создается  программный  канал.  Заметьте,  что  канал
          создается до запуска подпроцесса.

16-22     После запуска подпроцесса, родитель пишет в канал сообщение,
          ожидает сообщения  из того  же самого  конца канала, и пишет
          полученное сообщение на терминал.

23-29     Аналогичным образом,  порожденный процесс  пишет сообщение в
          свой конец канала и ждет сообщения из него.

Эта программа работает так:
$ pipe1.SVR4
Parent hears: I want ice cream

$ Child hears: Eat your spinach

$

Файл: pipe1.SVR4.c
                     ПРОГРАММНЫЕ КАНАЛЫ - ПРИМЕР

 1    #include <sys/types.h>
 2    #include <unistd.h>
 3    #define   MSGSIZE   20
 4
 5    main(int argc, char **argv)
 6    {
 7         int fd[2]; pid_t pid;
 8         static char msgout1[MSGSIZE] = "I want ice cream\n";
 9         static char msgout2[MSGSIZE] = "Eat your spinach\n";
10         static char msgin[MSGSIZE];
11
12         if (pipe(fd) == -1) {
13               perror(argv[0]); exit(1);
14         }
15
16         if ((pid = fork()) > 0) {       /* parent */
17               if(write(fd[1], msgout2, MSGSIZE) == -1)
18                     perror("Parent write");
19               if(read(fd[1], msgin, MSGSIZE) == -1)
20                     perror("Parent read");
21               printf("Parent hears: %s\n", msgin);
22         }
23         else if(pid == 0)  {            /* child */
24               if(write(fd[0], msgout1, MSGSIZE) == -1)
25                     perror("Child write");
26               if(read(fd[0], msgin, MSGSIZE) == -1)
27                     perror("Child read");
28               printf("Child hears: %s\n", msgin);
29         }
30         else {      /* cannot fork */
31               perror(argv[0]);
32               exit(2);
33         }
34         exit(0);
35    }