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
Последние статьи :
  Rust 07.11   
  Go 25.12   
  EXT4 10.11   
  FS benchmark 15.09   
  Сетунь 23.07   
  Trees 25.06   
  Apache 03.02   
  SQL 30.07   
  JFS 10.06   
  B-trees 01.06   
 
TOP 20
 Go Web ...802 
 Httpd-> История Ap...503 
 2.0-> Linux IP Networking...419 
 Trees...362 
 MySQL & PosgreSQL...361 
 Secure Programming for Li...349 
 Assembler...292 
 TCP 2...258 
 Mod_perl 1...253 
 Steve Pate 3...249 
 Secure Programming for Li...248 
 Cluster 3...237 
 Максвелл 3...232 
 Advanced Bash Scripting G...229 
 Linux Inline Assembly...225 
 Python...220 
 Rubni-Corbet -> Глав...210 
 Mod_perl 2...210 
 Steve Pate 1...209 
 Rodriguez 8...208 
 
  01.06.2017 : 2215600 посещений 

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 .

       
 

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

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

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