Книга: UNIX: взаимодействие процессов
Примеры
Примеры
Теперь воспользуемся четырьмя только что написанными программами. Создадим очередь и поместим в нее три сообщения:
solaris % msgcreate /tmp/no/such/file
ftok error for pathname "tmp/no/such/file" and id 0: No such file or directory
solaris % touch /trap/test1
solaris % msgcreate /tmp/test1
solaris % msgsnd /tmp/test1 1 100
solaris % msgsnd /tmp/test1 2 200
solaris % msgsnd /tmp/test1 3 300
solaris % ipcs –qo
IPC status from <running system> as of Sat Jan 10 11:25:45 1998
T ID KEY MODE OWNER GROUP CBYTES QNUM
Message Queues:
q 100 0х0000113e –rw-r--r-- rstevens other1 6 3
Сначала мы пытаемся создать очередь, используя имя несуществующего файла. Пример показывает, что файл, указываемый в качестве аргумента ftok, обязательно должен существовать. Затем мы создаем файл /tmp/test1 и используем его имя при создании очереди сообщений. После этого в очередь помещаются три сообщения длиной 1, 2 и 3 байта со значениями типа 100, 200 и 300 (вспомните рис. 6.1). Программа ipcs показывает, что в очереди находятся 3 сообщения общим объемом 6 байт.
Теперь продемонстрируем использование аргумента type при вызове msgrcv для считывания сообщений в произвольном порядке:
solaris % msgrcv –t 200 /tmp/test1
read 2 bytes, type = 200
solaris % msgrcv –t -300 /tmp/test1
read 1 bytes, type = 100
solaris % msgrcv /tmp/test1
read 3 bytes, type = 300
solaris % msgrcv –n /tmp/test1
msgrcv error: No message of desired type
В первом примере запрашивается сообщение с типом 200, во втором примере — сообщение с наименьшим значением типа, не превышающим 300, а в третьем — первое сообщение в очереди. Последний запуск msgrcv иллюстрирует действие флага IPC_NOWAIT.
Что произойдет, если мы укажем положительное значение типа, а сообщений с таким типом в очереди не обнаружится?
solaris % ipcs –qo
IPC status from <running system> as of Sat Jan 10 11:37:01 1998
T ID KEY MODE OWNER GROUP CBYTES QNUM
Message Queues:
q 100 0x0000113e –rw-r--r-- rstevens other1 0 0
solaris % msgsnd /tmp/test1 1 100
solaris % msgrcv –t 999 /temp/test1
^? нажали клавишу прерывания выполнения программы
solaris % msgrcv –n –t999/tmp/test1
msgrcv error: No message of desired type
solaris % grep desired /usr/include/sys/errno.h
#define ENOMSG 35 /* No message of desired type */
solaris % msgrmid /tmp/test1
Сначала мы вызываем ipcs, чтобы убедиться, что очередь пуста, а затем помещаем в нее сообщение длиной 1 байт с типом 100. Затем мы запрашиваем сообщение с типом 999, и программа блокируется (при вызове msgrcv), ожидая помещения в очередь сообщения с указанным типом. Мы прерываем ожидание нажатием клавиши. Затем мы запускаем программу с флагом –n, предотвращающим блокировку, и видим, что в этом случае возвращается ошибка с кодом ENOMSG. После этого мы удаляем очередь с помощью программы msgrmid. Мы могли бы удалить очередь и с помощью системной команды
solaris % ipcrm –q 100
в которой указывается идентификатор очереди, или с помощью той же команды в другом формате
solaris % ipcrm –Q 0x113e
где указывается ключ очереди сообщений.
- Примеры получения статистики
- 4.11.2. Примеры добавления ipchains-правил
- 4.11.3. Примеры удаления ipchains-правил
- 4.12.3. Примеры конфигурирования iptables
- Примеры концептуальных положений и целей проекта
- Примеры творческих промоакций
- Таблица 14.1. Примеры имен файлов в результате задания правил форматирования
- Приложение I. Примеры сценариев
- Примеры администраторов ресурсов
- Примеры метапоисковых машин Интернета
- Еще примеры необычной гарантии
- Примеры разных стратегий продвижения