5.12.5 Примеры

We use cookies. Read the Privacy and Cookie Policy

5.12.5 Примеры

Программа на Рисунке 5.18 иллюстрирует искусственное использование каналов. Процесс создает канал и входит в бесконечный цикл, записывая в канал строку символов «hello» и считывая ее из канала. Ядру не нужно ни знать о том, что процесс, ведущий запись в канал, является и процессом, считывающим из канала, ни проявлять по этому поводу какое-либо беспокойство.

char string[] = "hello";

main() {

 char buf[1024];

 char *cp1,*cp2;

 int fds[2];

 cp1 = string;

 cp2 = buf;

 while(*cp1) *cp2++ = *cp1++;

 pipe(fds);

 for (;;) {

  write(fds[1], buf, 6);

  read(fds[0], buf, 6);

 }

}

Рисунок 5.18. Чтение из канала и запись в канал

Процесс, выполняющий программу, которая приведена на Рисунке 5.19, создает поименованный канал с именем «fifo». Если этот процесс запущен с указанием второго (формального) аргумента, он постоянно записывает в канал строку символов «hello»; будучи запущен без второго аргумента, он ведет чтение из поименованного канала. Два процесса запускаются по одной и той же программе, тайно договорившись взаимодействовать между собой через поименованный канал «fifo», но им нет необходимости быть родственными процессами. Другие пользователи могут выполнять программу и участвовать в диалоге (или мешать ему).

#include ‹fcntl.h›

char string[] = "hello";

main(argc, argv)

int argc;

char *argv[];

{

 int fd;

 char buf[256];

 /* создание поименованного канала с разрешением чтения и записи для всех пользователей */

 mknod("fifo", 010777, 0);

 if (argc == 2)  fd = open("fifo", O_WRONLY);

 else fd = open("fifo", O_RDONLY);

 for (;;)

 if (argc == 2) write(fd, string, 6);

  else read(fd, buf, 6);

}

Рисунок 5.19. Чтение и запись в поименованный канал