
- •System V ipc
- •Введение
- •Средства System V ipc
- •Структура api System V ipc
- •Общие свойства средств ipc
- •Общие свойства средств ipc - (продолжение)
- •*Get - основные сведения
- •Получение ключа ipc
- •*Ctl - основные сведения
- •*Op - основные сведения
- •Структура очередей сообщений
- •Доступ к очереди сообщений
- •Управление очередью сообщений
- •Msgctl(2) - Пример
- •Формат сообщения
- •Операции - очереди сообщений - msgsnd(2)
- •Операции - очереди сообщений - msgrcv(2)
- •Пример сообщений - отправитель
- •Пример сообщений - получатель
- •Пример сообщений - вывод
- •Семафоры
- •Системные вызовы для работы с семафорами
- •Получение доступа к набору семафоров
- •Получение доступа к семафору - Пример
- •Управление семафорами
- •Semctl(2) - Примеры
- •Инициализировать и удалить семафор - Пример
- •Блокировка ресурса - Пример
- •Набор семафоров - Использование
- •Создание набора семафоров - Пример
- •Операции над набором семафоров — Пример (продолжение)
- •Разделяемая память
- •Разделяемая память
- •Создание/получение разделяемой памяти
- •Управление разделяемой памятью
- •Операции над разделяемой памятью
- •Разделяемая память - Родительский процесс
- •Разделяемая память - Родительский процесс
- •Разделяемая память - Порожденный процесс
- •Разделяемая память - вывод
Разделяемая память - Порожденный процесс
Родительский процесс создает три подпроцесса. Каждый из них будет продавать места, подсчитываемые переменной в разделяемой памяти. Семафор позволяет избежать одновременных попыток изменения счетчика.
16-20 Проверяет правильность числа аргументов
22 Напоминаем, что родитель использовал в качестве ключа при создании разделяемого сегмента IPC_PRIVATE. Идентификатор разделяемого сегмента передается как аргумент exec(2). Здесь он должен быть преобразован назад из ASCII в целое число.
23 Отображает разделяемый сегмент в адресное пространство процесса.
28 Получает идентификатор семафора из аргумента командной строки.
29 Продает места, пока счетчик оставшихся мест, хранящийся в разделяемой памяти, не станет нулевым. Вместо такого счетчика можно было бы использовать семафор.
30 Отсоединяет разделяемый сегмент.
РАЗДЕЛЯЕМАЯ ПАМЯТЬ - ПОРОЖДЕННЫЙ ПРОЦЕСС 1 #include"registration.h"2 #include<stdlib.h>3 #include<unistd.h>4 #include<sys/types.h>5 #include<sys/ipc.h>6 #include<sys/sem.h>7 #include<sys/shm.h>8 #include<stdio.h>9 static struct CLASS*class_ptr;10 static char *pname;11 static intshmid, semid, ret;12 static struct sembuf lock ={ 0, -1, 0};13 static struct sembuf unlock ={ 0, 1, 0};14 static void sell_seats(void),rpterror(char*);15 main(int argc, char *argv[])16 {17 if(argc < 3){18 fprintf(stderr,"Usage:%s shmid semid\n",argv[0]);19 exit(1);20 }21 pname = argv[0];22 sscanf(argv[1], "%d", &shmid);23 class_ptr = shmat(shmid, 0, 0);24 if(class_ptr == (struct CLASS *) -1){25 rpterror("shmat failed");26 exit(2);27 }28 sscanf(argv[2], "%d", &semid);29 sell_seats();30 ret = shmdt(class_ptr);31 exit(0);32 }
36-60 Каждые десять секунд или меньше пытается продать место. Вызов semop в строках40 и 53 гарантируют, что только один процесс в каждый момент изменяет разделяемую память (переменную seats_left). Когда не осталось мест, цикл заканчивается. Это приводит к возврату из функциии завершению программы.
61-66 Функция rpterror() добавляет имя процесса к строке, которая затем передается библиотечной функции perror(3C).
Файл: shmc.c 36 static void sell_seats(void){37 int all_out = 0;38 srand( (unsigned)getpid());39 while ( !all_out ){ /*loop to sell all seats*/40 if(semop(semid,&lock,1) == -1){41 rpterror("semop lock failed");42 exit(4);43 }44 if (class_ptr->seats_left > 0){45 class_ptr->seats_left--;46 printf("%s SOLD SEAT -- %2d left\n",47 pname,class_ptr->seats_left);48 }49 else{50 all_out++;51 printf("%s sees no seats left\n", pname);52 }53 ret = semop(semid,&unlock,1);54 if (ret == -1) {55 rpterror("semop unlock failed");56 exit(4);57 }58 sleep( (unsigned)rand()%10 + 1);59 }60 }61 static void rpterror(char *string)62 {63 char errline[50];64 sprintf(errline,"%s %s", string, pname);65 perror(errline);66 }
Разделяемая память - вывод
Продавцы продают все свободные места. Каждый завершается, когда видит, что больше мест не осталось. Родительский процесс удаляет разделяемую память и набор семафоров после того, как все продавцы завершились.
РАЗДЕЛЯЕМАЯ ПАМЯТЬ - ВЫВОД $ shmpshmc1 sold seat -- 14 leftshmc2 sold seat -- 13 leftshmc3 sold seat -- 12 leftshmc2 sold seat -- 11 leftshmc3 sold seat -- 10 leftshmc1 sold seat -- 9 leftshmc2 sold seat -- 8 leftshmc3 sold seat -- 7 leftshmc3 sold seat -- 6 leftshmc1 sold seat -- 5 leftshmc2 sold seat -- 4 leftshmc3 sold seat -- 3 leftshmc3 sold seat -- 2 leftshmc2 sold seat -- 1 leftshmc1 sold seat -- 0 leftshmc3 sees there are no seats leftshmc1 sees there are no seats leftshmc2 sees there are no seats leftparent removing shm and sem$