Книга: Архитектура операционной системы UNIX

5.12.5 Примеры

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. Чтение и запись в поименованный канал

Оглавление книги


Генерация: 0.066. Запросов К БД/Cache: 0 / 2
поделиться
Вверх Вниз