Операционные системы. Замятин А.В - 93 стр.

UptoLike

Составители: 

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.