Чтение онлайн

на главную - закладки

Жанры

UNIX: взаимодействие процессов

Стивенс Уильям Ричард

Шрифт:

10 oflag |= IPC_EXCL;

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 exit(0);

19 }

Программа semrmid

Следующая программа, текст которой приведен в листинге 11.2, удаляет набор семафоров из системы. Для этого используется вызов semctl с командой (аргументом cmd) IPC_RMID.

Листинг 11.2. Программа semrmid

//svsem/semrmid.c

1 #include "unpipc.h"

2 int

3 main(int argc, char **argv)

4 {

5 int semid;

6 if (argc != 2)

7 err_quit("usage: semrmid <pathname>"):

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 позволяет установить все значения семафоров набора одновременно.

Листинг 11.3. Программа semsetvalues

//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 <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 = 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 позволяет получить все значения семафоров набора одновременно. Каждое значение выводится.

Листинг 11.4. Программа semgetvalues

//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 <pathname>");

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 /* получаем и выводим значения семафоров */

Поделиться:
Популярные книги

Атаман царского Спецназа

Корчевский Юрий Григорьевич
Боевая фантастика Ю. Корчевского
Фантастика:
боевая фантастика
попаданцы
альтернативная история
6.00
рейтинг книги
Атаман царского Спецназа

Неучтенный элемент. Том 8

NikL
8. Антимаг. Вне системы
Фантастика:
фэнтези
5.00
рейтинг книги
Неучтенный элемент. Том 8

История Шотландии с древнейших времен до флодденского сражения 1513 года.

Скотт Вальтер
Научно-образовательная:
история
5.00
рейтинг книги
История Шотландии с древнейших времен до флодденского сражения 1513 года.

Газлайтер. Том 22

Володин Григорий Григорьевич
22. История Телепата
Фантастика:
боевая фантастика
попаданцы
фэнтези
5.00
рейтинг книги
Газлайтер. Том 22

Воронцов. Перезагрузка. Книга 5

Тарасов Ник
5. Воронцов. Перезагрузка
Фантастика:
попаданцы
альтернативная история
фэнтези
фантастика: прочее
6.00
рейтинг книги
Воронцов. Перезагрузка. Книга 5

Кодекс Охотника. Книга IV

Винокуров Юрий
4. Кодекс Охотника
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Кодекс Охотника. Книга IV

Катализ

Скаландис Ант
Фантастика:
научная фантастика
5.00
рейтинг книги
Катализ

Газлайтер. Том 16

Володин Григорий Григорьевич
16. История Телепата
Фантастика:
боевая фантастика
попаданцы
аниме
5.00
рейтинг книги
Газлайтер. Том 16

Анти-Ксенонская Инициатива

Вайс Александр
7. Фронтир
Фантастика:
боевая фантастика
космическая фантастика
космоопера
5.00
рейтинг книги
Анти-Ксенонская Инициатива

Хозяин Теней 5

Петров Максим Николаевич
5. Безбожник
Фантастика:
аниме
фэнтези
фантастика: прочее
попаданцы
5.00
рейтинг книги
Хозяин Теней 5

Старый, но крепкий 5

Крынов Макс
5. Культивация без насилия
Фантастика:
рпг
аниме
уся
фэнтези
5.00
рейтинг книги
Старый, но крепкий 5

Кодекс Крови. Книга IV

Борзых М.
4. РОС: Кодекс Крови
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Кодекс Крови. Книга IV

На границе империй. Том 9. Часть 2

INDIGO
15. Фортуна дама переменчивая
Фантастика:
космическая фантастика
попаданцы
5.00
рейтинг книги
На границе империй. Том 9. Часть 2

Тринадцатый VII

NikL
7. Видящий смерть
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Тринадцатый VII