Телекоммуникационные технологии. Том 1



         

Краткий справочник по командам UNIX - часть 14


FIFO также как и обычные канала работают с соблюдением следующих правил.
  • Если из канала берется меньше байтов, чем там содержится, остальные остаются там для последующего чтения.

  • При попытке прочесть больше байт, чем имеется в канале, читающий процесс должен соответствующим образом обработать возникшую ситуацию.

  • Если в канале ничего нет и ни один процесс не открыл его на запись, при чтении будет получено нуль байтов. Если один или более процессов открыло канал на запись, вызов read будет заблокирован до появления данных.

  • В случае записи в канал несколькими процессами, эти данные не перемешиваются.

  • При попытке записать большее число байтов, чем это позволено каналом или FIFO, вызов write блокируется до освобождения нужного места. Если процесс предпринимает попытку записи в канал, не открытый ни одним из процессов для чтения, процессу посылается сигнал SIGPIPE, а вызов write присылает 0 с кодом ошибки errno=EPIPE.

Сообщения

Очереди сообщения являются составной частью UNIX System V. Процесс, заносящий сообщение в очередь, может не ожидать чтения этого сообщения каким-либо другим процессом. Сообщения имеют следующие атрибуты:

  • Тип сообщения

  • Длина данных в байтах

  • Данные (если длина ненулевая)

Очередь сообщений имеет вид списка в адресном пространстве ядра. Для каждой очереди ядро формирует заголовок(msqid_ds), где размещаются данные о правах доступа к очереди (msg_perm), о текущем состоянии очереди (msg_cbytes - число байтов msg_qnum - число сообщений в очереди), а также указатели на первое и последнее сообщение. Создание новой очереди сообщений осуществляется посредством системного вызова msgget:

#include <sys/types.h>
#include <sys/ipc.h>
#include e <sys/ipc.h>
int msgget( key_t key, int msgflag );

Эта функция выдает дескриптор элемента очереди, или -1 - в случае ошибки. Процесс может с помощью оператора msgsnd поместить сообщение в очередь, получить сообщение из очереди посредством msgrcv и манипулировать сообщениями с помощью msgctl.

Семафоры




Содержание  Назад  Вперед