Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <stdio.h>
- #include <sys/ipc.h>
- #include <sys/sem.h>
- #include <sys/stat.h>
- // идентификатор набора семафоров
- #define KEY 100
- // сколько семафоров имеется в наборе
- #define NUM_SEM 5
- int main() {
- // права 777
- int perms = S_IRWXU | S_IWUSR | S_IRGRP;
- // прерывает свою работу, если нет набора семафоров
- int fd = semget(KEY, NUM_SEM, 0);
- // если нет набора семафоров
- if (fd == -1) {
- /* Открывается набор из 5-ти семафоров с идентификатором 100.
- Этот набор создаётся с правами 777. */
- fd = semget(KEY, NUM_SEM, IPC_CREAT | perms);
- // если системный вызов прерывается
- if (fd == -1) {
- printf("Ошибка в semget\n");
- return 0;
- }
- }
- union semun {
- // значение семафора
- int val;
- // управляющие параметры набора
- struct semid_ds *buf;
- // массив значений семафора
- ushort *array;
- } arg;
- struct semid_ds buf;
- arg.buf = &buf;
- // определить число семафоров
- if (semctl(fd, 0, IPC_STAT, arg.buf) == -1) {
- printf("Ошибка в 1-ом semctl\n");
- return 0;
- }
- int i, length = arg.buf->sem_nsems;
- // установить значения семафоров
- for (i = 0; i < length; ++i)
- arg.array[i] = 10 * (i + 1);
- // установить все семафоры
- if (semctl(fd, 0, SETALL, arg.array) == -1) {
- printf("Ошибка во 2-ом semctl\n");
- return 0;
- }
- char choice;
- do {
- printf("Вы хотите выйти?\n");
- choice = getchar();
- } while (choice != 'y' && choice != 'Y');
- // удаляется набор семафоров
- if (semctl(fd, 0, IPC_RMID, 0) == -1)
- printf("Ошибка в 3-ем semctl\n");
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement