Главная страница Взаимодействие нетривиальных процессов Программа semcreate Первая программа, текст которой приведен в листинге 11.1,* просто создает набор семафоров System V. Параметр командной строки -е соответствует флагу IPC EXCL при вызове semget, а последним аргументом командной строки является количество семафоров в создаваемом наборе. Листинг 11.1. Программа semcreate svsem/semcreate.c 1 finclude unpipc.h 2 int 3 main(int argc. char **argv) 5 int c. oflag, semid. nsems: 6 oflag = SVSEM MODE IPC CREAT; 7 while ( (c = GetoptCargc. argv, e )) != -1) { 8 switch (c) { 9 case e: 10 oflag 1= IPCJXCL: 11 break: 12 } 13 } 14 if (optind != argc - 2) 15 err quit( usage: semcreate [ -e ] <pathname> <nsems> ); 16 nsems = atoi(argv[optind +1]); 17 semid = Semget(Ftok(argv[optind], 0), nsems, oflag): 18 exitCO); 19 } Программа semrmid Следующая программа, текст которой приведен в листинге 11.2, удаляет набор семафоров из системы. Для этого используется вызов semctl с командой (аргументом cmd) IPC RMID. Листинг 11.2. Программа semrmid svsem/semrmid.c 1 finclude unpipc.h 2 int 3 maindnt argc. char **argv) 5 int semid: 6 if (argc != 2) 7 err quit( usage: semrmid <pathname> ); 8 semid = Semget(Ftok(argv[l]. 0). 0, 0): 9 SemctKsemid. 0, IPC RMID); продолжение Листинг 11.2 (продолжение) 10 exit(O): И } Программа semsetvalues Программа semsetvalues (листинг 11,3) устанавливает значения всех семафоров набора. Получение количества семафоров в наборе 11-15 После получения идентификатора семафора с помощью semget мы вызываем semctl с командой IPC STAT, чтобы получить значения полей структуры semid ds для данного семафора, Поле sem nsems содержит нужную нам информацию о количестве семафоров в наборе. Установка всех значений 19-24 Мы выделяем память под массив беззнаковых коротких целых, по одному элементу на каждый семафор набора, затем копируем полученные из командной строки значения в этот массив. Вызов semctl с командой SETALL позволяет установить все значения семафоров набора одновременно. Листинг 11.3. Программа semsetvalues svsem/semsetvalues.c 1 finclude unpipc.h 2 int 3 maindnt argc. char **argv) 5 int semid. nsems, i; 6 struct semid ds seminfo: 7 unsigned short *ptr; 8 union semun arg; 9 if (argc < 2) 10 err quit( usage: semsetvalues <pathname> [ values ... ] ); 11 /* получение количества семафоров в наборе */ 12 semid = Semget(Ftok(argv[1], 0). 0. 0); 13 arg.buf - &seminfo; 14 Semctl(semid. 0. IPC STAT. arg); 15 nsems = arg.buf->sem nsems; 16 /* получение значений из командной строки */ 17 if (argc != nsems + 2) 18 err quit( d semaphores in set. d values specified , nsems. argc-2); 19 /* выделение памяти под значения семафоров набора, помещение этих значений в новый массив */ 20 ptr - Canoc(nsems. sizeof(unsigned short)): 21 arg.array = ptr; 22 for (i - 0: i < nsems: i++) 23 ptr[i] = atoi(argv[i +2]); 24 SemctKsemid. 0. SETALL. arg): 25 exit(O); 26 } Программа semgetvalues в листинге 11,4 приведен текст программы semgetvalues, которая получает и выводит значения всех семафоров набора. Получение количества семафоров в наборе 11-15 После получения идентификатора семафора с помощью semget мы вызываем semctl с командой I PC STAT для получения значений полей структуры semi d ds данного семафора, Поле semnsems содержит нужную нам информацию о количестве семафоров в наборе. Получение всех значений 16-22 Мы выделяем память под массив беззнаковых коротких целых, по одному элементу на каждый семафор набора. Вызов semctl с командой GETALL позволяет получить все значения семафоров набора одновременно. Каждое значение выводится. Листинг 11.4. Программа semgetvalues svsem/semgetvalues.с 1 finclude unpipc.h 2 int 3 maindnt argc. char **argv) 5 int semid. nsems. i; 6 struct semid ds seminfo; 7 unsigned short *ptr: 8 union semun arg: 9 if (argc != 2) 10 err quit( usage: semgetvalues <pathname> ); 11 /* получаем количество семафоров в наборе */ 12 semid - Semget(Ftok(argv[1]. 0). 0. 0): 13 arg.buf = &seminfo: 14 SemctKsemid. 0. IPC STAT. arg): 15 nsems - arg.buf->sem nsems: 16 /* выделяем память под имеющееся количество элементов */ 17 ptr = Canoc(nsems. sizeof (unsigned short)): 18 arg.array = ptr; 19 /* получаем и выводим значения семафоров */ 20 SemctKsemid. 0. GETALL. arg): 21 for (i = 0: i < nsems: i++) 22 pri ntf ( semval [ d] - Шп . i. ptr[i]): 23 exit(O): 24 1
|
© 2000 - 2024 ULTRASONEX-AMFODENT.RU.
Копирование материалов разрешено исключительно при условии цититирования. |