Главная страница  Взаимодействие нетривиальных процессов 

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 [ 98 ] 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186

Программа 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



1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 [ 98 ] 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186

© 2000 - 2024 ULTRASONEX-AMFODENT.RU.
Копирование материалов разрешено исключительно при условии цититирования.