Search     or:     and:
 LINUX 
 Language 
 Kernel 
 Package 
 Book 
 Test 
 OS 
 Forum 
 iakovlev.org 
 Books
  Краткое описание
 Linux
 W. R. Стивенс TCP 
 W. R. Стивенс IPC 
 A.Rubini-J.Corbet 
 K. Bauer 
 Gary V. Vaughan 
 Д Вилер 
 В. Сталлинг 
 Pramode C.E. 
 Steve Pate 
 William Gropp 
 K.A.Robbins 
 С Бекман 
 Р Стивенс 
 Ethereal 
 Cluster 
 Languages
 C
 Perl
 M.Pilgrim 
 А.Фролов 
 Mendel Cooper 
 М Перри 
 Kernel
 C.S. Rodriguez 
 Robert Love 
 Daniel Bovet 
 Д Джеф 
 Максвелл 
 G. Kroah-Hartman 
 B. Hansen 
NEWS
Последние статьи :
  Тренажёр 16.01   
  Эльбрус 05.12   
  Алгоритмы 12.04   
  Rust 07.11   
  Go 25.12   
  EXT4 10.11   
  FS benchmark 15.09   
  Сетунь 23.07   
  Trees 25.06   
  Apache 03.02   
 
TOP 20
 Linux Kernel 2.6...5170 
 Trees...939 
 Максвелл 3...870 
 Go Web ...823 
 William Gropp...803 
 Ethreal 3...787 
 Gary V.Vaughan-> Libtool...772 
 Ethreal 4...771 
 Rodriguez 6...763 
 Ext4 FS...755 
 Steve Pate 1...754 
 Clickhouse...753 
 Ethreal 1...742 
 Secure Programming for Li...731 
 C++ Patterns 3...716 
 Ulrich Drepper...696 
 Assembler...694 
 DevFS...661 
 Стивенс 9...649 
 MySQL & PosgreSQL...631 
 
  01.01.2024 : 3621733 посещений 

iakovlev.org

У. Стивенс , Взаимодействие процессов

Исходники всех примеров для этой книги от Стивенса лежат тут

Исходники для этой страницы лежат тут

Глава 1 : Обзор средств взаимодействия процессов UNIX

Методы передачи сообщений в порядке их хронологического порядка можно разделить на группы :

       
 	1. Каналы - pipes и fifo (именованные каналы) . 
          Pipe работает только в связке родительский процесс - дочерний процесс .
 	  Fifo работает между любыми процессами .
 	2. Очереди стандарта System V queue 
 	3. Очереди сообщений Posix message queue
 	4. Удаленный вызов процедур - remote ptocedure calls - RPC 
 
Формы синхронизации развивались в следующем порядке :
       
 	1. Блокировка записей - locking
 	2. Семафоры System V semaphores  , а также shared memory 
 	3. Семафоры POSIX POSIX semaphores и shared memory
 	4. Взаимные исключения mutex и условные переменные conditional variables 
 	5. Блокировка чтения-записи - read-write locks  
 

Стандарт потоков POSIX Pthreads был принят в 1995 году . У всех потоков общие глобальные переменные .

По продолжительности жизни обьекты IPC можно разделить на 3 группы :

       
 	1. Process-persistent - обьект живет до тех пор , пока живут процессы , в которых он задействован
 					К ним относятся pipe , fifo , mutex
 	2. Kernel-persistent - живет до перезагрузки ядра или до явного его удаления
 			К ним относятся queue , семафоры , shared memory
 	3. Filesystem-persistent - дивет до тех пор , пока явно не удаляется из файловой системы ,
 			причем перезагрузка ядра не влияет . 
 			Этот тип избыточен , поэтому практически не применяется.
 
Стандарты POSIX имеют несколько редакций :
       
 	1. 1988 год  - определял интерфейс между языком Си и ядром
 	2. 1990 - описание си-шного API
 	3. 1992 - описание шелл и более 100 утилит
 	4. 1993 - синхронизация , асинхронный ввод-вывод , семафоры , sheduling , очереди
 	5. 1996 - pthreads 
 

Глава 2 : POSIX IPC

К ним относятся
       
 	1. Очереди
 	2. Семафоры
 	3. Разделяемая память
 
Все эти обьекты идентифицируются полными именами. Эти обьекты создаются с помощью функций mq_open , sem_open , shm_open . При этом происходят проверки :
       
 	1. Идентификатор пользователя должен быть равен 0 - рут
 	2. Проверяются права на чтение-запись
 	3. ID группы процесса совпадает с групповым ID обьекта IPC
 	4. Бит разрешения для прочих пользователей должен быть установлен
  
При создании обьекта IPC нужно указать набор флагов , аналогичный как и при открытии функции open .

Глава 3 : SYSTEM V IPC

К ним относятся те же обьекты
       
 	1. Очереди
 	2. Семафоры
 	3. Разделяемая память
 
Идентификатор имеет тип key_t , который возвращается функцией ftok
       
 	key_t ftok(const char *path , int id);
 
И сервер , и клиент должны иметь одно и то же имя для идентификации .

Рассмотрим следующий пример : в качестве параметра этой программе нужно дать путь к какому-то конкретному файлу , будет сначала для него вызвана системная функция stat , а потом припенена ftok (все функции с большой буквы - это врапперы для одноименных функций ):

 //svipc/stok.c
 
 int main(int argc, char **argv)
 {
 	struct stat	stat;
 
 	if (argc != 2)
 		err_quit("usage: ftok ");
 
 	Stat(argv[1], &stat);
 	printf("st_dev: %lx, st_ino: %lx, key: %x\n",
 		   (u_long) stat.st_dev, (u_long) stat.st_ino,
 		   Ftok(argv[1], 0x57));
 
 	exit(0);
 }
 
 
Его вывод у меня был примерно таким :
       
 	st_dev: 809, st_ino: 15dfae, key: 5709dfae
 
Функция ftok изпользует битовое представление некоторых параметров полученной структуры stat.

Права обьекта ipc хранятся в структуре ipc_perm :
При открытии обьекта IPC выполняется следующая логическая последовательность действий :
Как правило , обьект IPC всегда создается с ключом IPC_CREAT и флаги не устанавливаются .

Обьект IPC создается с помощью одной из трех функций getXXX : msgget , semget , shmget .

Структура ipc_perm содержит счетчик seq , в которой ядро хранит порядковый номер канала . При удалении обьекта счетчик увеличивается. Отличие этого счетчика от , например , дескриптора файла , в том , что каждый процесс при открытии своих файлов каждый раз создает свои собственные дескрипторы, которые никак не пересекаются с дескрипторами из других процессов, а вот счетчик seq - один для всей системы .

Идентификатор IPC также един для всей системы и представляет из себя целое число . В следующей программе выводятся идентификаторы , которые генерятся программой msgget :

 //svmsg/slot.c
 
 int main(int argc, char **argv)
 {
 	int		i, msqid;
 
 	for (i = 0; i < 10; i++) {
 
 		msqid = Msgget(IPC_PRIVATE, SVMSG_MODE | IPC_CREAT);
 		printf("msqid = %d\n", msqid);
 
 		Msgctl(msqid, IPC_RMID, NULL);
 	}
 	exit(0);
 }
 
При очередном проходе цикла msgget создает очередь сообщений , а msgctl тут же удаляет ее . При повторном запуске программы номера идентификаторов IPC будут уже совсем другие .

Для просмотра и удаления обьектов IPC System V существуют консольные команды ipcs и ipcrm .

       
 

       
 
Оставьте свой комментарий !

Ваше имя:
Комментарий:
Оба поля являются обязательными

 Автор  Комментарий к данной статье