- •Сигналы:
- •Группы и сеансы
- •Управление сигналами
- •Отправление сигнала
- •Взаимодействие между процессами
- •Int pipe(int *fieldes);
- •Int mknod(char *pathname, int mode, int dev);
- •Сообщения
- •Int msgget(key_t key, int msgflag);
- •Int msgsnd(int msqid, const void *msgp, size_t msgsz, int msgflg);
- •Int msgrcv(int msqid, void *msgp, size_t msgsz, long msgtyp, int msgflg);
- •Int semget(key_t key, int nsems, int semflag);
- •Int semop(int semid,
- •0, 1, 0}; /* Затем увеличить значение
- •0,1,0 /*Увеличить значение семафора на 1*/
- •Int shmget(key_t key, int size, int shmflag);
- •Int *shmat( int shmid, char *shmaddr, int shmflag);
- •Int shmdt(char *shmaddr);
- •Int segment;
- •Int shmid, semid;
Взаимодействие между процессами
в UNIX процессы выполняются в собственном адресном пространстве и по существу изолированы друг от друга.
Тем самым сведены к минимуму возможности влияния процессов друг на друга, что является необходимым в многозадачных операционных системах.
Для реализации взаимодействия требуется:
- обеспечить средства взаимодействия между процессами и одновременно
- исключить нежелательное влияние одного процесса на другой.
Взаимодействие между процессами необходимо для решения следующих задач:
- Передача данных. Один процесс передает данные другому процессу, при этом их объем может варьироваться от десятков байтов до нескольких мегабайтов.
- Совместное использование данных. Вместо копирования информации от одного процесса к другому, процессы могут совместно использовать одну копию данных, причем изменения, сделанные одним процессом, будут сразу же заметны для другого. Количество взаимодействующих процессов может быть больше двух. При совместном использовании ресурсов процессам может понадобиться некоторый протокол взаимодействия для сохранения целостности данных и исключения конфликтов при доступе к ним.
- Извещения. Процесс может известить другой процесс или группу процессов о наступлении некоторого события (например, для синхронизации выполнения нескольких процессов).
операционная система должна обеспечить механизмы межпроцессного взаимодействия
(Intel-Process Communication, IPC).
К средствам межпроцессного взаимодействия, присутствующим во всех версиях UNIX, можно отнести:
- сигналы
- каналы
- FIFO (именованные каналы)
- сообщения (очереди сообщений)
- семафоры
- разделяемую память
Последние три типа IPC обычно обобщенно называют System V IPC.
Во многих версиях UNIX есть еще одно средство IРС — сокеты, впервые предложенные в BSD UNIX
Сигналы изначально были предложены как средство уведомления об ошибках, но могут использоваться и для элементарного IРС, например, для синхронизации процессов или для передачи простейших команд от одного процесса к другому (Например, для сервера системы имен (DNS) named, (1M) таким образом используется сигнал SIGHUP, по существу являющийся командой обновления базы данных).
сигналы очень ресурсоемки.
Отправка сигнала требует выполнения системного вызова, а его доставка — прерывания процесса-получателя и интенсивных операций со стеком процесса для вызова функции обработки и продолжения его нормального выполнения.
сигналы слабо информативны и их число весьма ограничено.
Каналы
при работе в командной строке shell:
cat myfile | wc
При этом (стандартный) вывод программы саt(1), которая выводит содержимое файла myfile, передается на (стандартный) ввод программы wc(1), которая, в свою очередь подсчитывает количество строк, слов и символов.
В результате мы получим:
12 45 260
что будет означать количество строк, слов и символов в файле myfile.
Т.о., два процесса обменялись данными. При этом использовался программный канал, обеспечивающий однонаправленную передачу данных между двумя задачами.
Для создания канала используется системный вызов pipe():