7 err_quit("usage: semrmid
8 semid = Semget(Ftok(argv[1], 0), 0, 0);
9 Semctl(semid, 0, IPC_RMID);
10 exit(0);
11 }
Программа semsetvalues
Программа semsetvalues (листинг 11.3) устанавливает значения всех семафоров набора.
11-15 После получения идентификатора семафора с помощью semget мы вызываем semctl с командой IPC_STAT, чтобы получить значения полей структуры semid_ds для данного семафора. Поле sem_nsems содержит нужную нам информацию о количестве семафоров в наборе.
19-24 Мы выделяем память под массив беззнаковых коротких целых, по одному элементу на каждый семафор набора, затем копируем полученные из командной строки значения в этот массив. Вызов semctl с командой SETALL позволяет установить все значения семафоров набора одновременно.
//svsem/semsetvalues.с
1 #include "unpipc.h"
2 int
3 main(int argc, char **argv)
4 {
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
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 = Calloc(nsems, sizeof(unsigned short));
21 arg.array = ptr;
22 for (i = 0; i < nsems; i++)
23 ptr[i] = atoi(argv[i +2]);
24 Semctl(semid, 0, SETALL, arg);
25 exit(0);
26 }
Программа semgetvalues
В листинге 11.4 приведен текст программы semgetvalues, которая получает и выводит значения всех семафоров набора.
11-15 После получения идентификатора семафора с помощью semget мы вызываем semctl с командой IPC_STAT для получения значений полей структуры semi d_ds данного семафора. Поле sem_nsems содержит нужную нам информацию о количестве семафоров в наборе.
16-22 Мы выделяем память под массив беззнаковых коротких целых, по одному элементу на каждый семафор набора. Вызов semctl с командой GETALL позволяет получить все значения семафоров набора одновременно. Каждое значение выводится.
//svsem/semgetvalues.c
1 #include "unpipc.h"
2 int
3 main(int argc, char **argv)
4 {
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
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 ptr = Calloc(nsems, sizeof(unsigned short));
18 arg.array = ptr;
19 /* получаем и выводим значения семафоров */
20 Semctl(semid, 0, GETALL, arg);
21 for (i = 0; i < nsems; i++)
22 printf("semval[%d] = %d\n", i, ptr[i]);
23 exit(0);
24 }
Программа semops