ВУЗ:
Составители:
93
ния. При использовании флага IPCNOWAIT ядро ОС Unix не блокирует
текущий процесс, а лишь сообщает в ответных параметрах о возникно-
вении ситуации, приведшей к блокированию процесса при отсутствии
флага IPCNOWAIT.
Именованные и неименованные каналы (пайпы)
Операционные системы семейства Unix всегда поддерживают два
типа однонаправленных каналов:
• неименованные каналы;
• именованные каналы FIFO.
Неименованные каналы – это самая первая форма IPC в Unix (1973),
главным недостатком которых является отсутствие имени, вследствие
чего они могут использоваться для взаимодействия только родственными
процессами. В Unix System третьей редакции (1982) были добавлены ка-
налы FIFO, которые называются именованными каналами. Аббревиатура
FIFO расшифровывается как «first in, first out» – «первым вошел, первым
вышел», то есть эти каналы работают как очереди. Именованные каналы
в Unix функционируют подобно неименованным – позволяют передавать
данные только в одну сторону. Однако в отличие от программных кана-
лов каждому каналу FIFO сопоставляется полное имя в файловой систе-
ме, что позволяет двум неродственным процессам обратиться к одному и
тому же FIFO. Доступ и к именованным каналам, и к неименованным ор-
ганизуется с помощью обычных функций read и write.
FIFO создается вызовом mkfifo:
#include <sys/types.h>
#include <sys/stat.h>
int mkfifo(const char *pathname, mode_t mode);
/* возвращает 0 при успешном выполнении, -1 при ошибке */
Здесь pathname – обычное для Unix полное имя файла, которое и
будет именем FIFO.
Аргумент mode указывает битовую маску разрешений доступа к
файлу (табл. 4.2), аналогично второму аргументу команды open.
Функция mkfifo действует как open, вызванная с аргументом
mode = O_CREAT | O_EXCL. Это означает, что создается новый канал
FIFO или возвращается ошибка EEXIST в случае, если канал с заданным
полным именем уже существует. Если не требуется создавать новый ка-
нал, вызывайте open вместо mkfifо. Для открытия существующего кана-
ла или создания нового, в том случае, если его еще не существует, вы-
зовите mkfifo, проверьте, не возвращена ли ошибка EEXIST, и если такое
случится, вызовите функцию open.
Страницы
- « первая
- ‹ предыдущая
- …
- 91
- 92
- 93
- 94
- 95
- …
- следующая ›
- последняя »
