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

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

Жанры

Linux: Полное руководство

Аллен Питер В.

Шрифт:

 void *__pad;

};

Первый член этого объединения val используется для установки значения одного семафора при использовании команды SETVAL.

Член buf используется командами IPC_STAT и IPC_SET. Это копия внутренней структуры данных семафора.

Указатель на массив array используется командами GETALL и SETALL для получения или установки значений всех семафоров во множестве.

Последние два члена объединения специфичны только для Linux — в других UNIX-системах вы их не найдете.

Эти элементы использует ядро.

В случае успеха системный вызов semctl возвращает натуральное число, а в случае ошибки -1. Переменная errno равна:

♦ EACCESS — не хватает полномочий;

♦ EFAULT — адрес arg ошибочен;

♦ EIDRM — множество помечено для удаления:

♦ EINVAL — неправильный аргумент semid;

♦ EPERM — у вас нет прав для выполнения команды cmd;

♦ ERANGE — значение семафора вышло за пределы допустимых значений.

Пример получения значения семафора с номером N из множества sid:

int val;

val=semctl(sid, N, GETVAL, 0);

Предположим, что нам нужно вывести состояние всех трех имеющихся принтеров:

int c, val;

for (c=0; x<3; c++) {

val=semctl(sid,c,GETVAL,0);

printf("Принтер %d: %d\n",c,val);

}

А вот код инициализации всех семафоров множества semid:

union semun opts;

int c;

opts.val = 1; /* первоначальное значение семафоров */

for (c=0;c<5;c++) semctl(semid, c, SETVAL, opts);

Довольно часто возникают определенные сложности с установкой прав доступа к множеству семафоров. Рассмотрим следующий код, позволяющий установить права доступа к множеству semid. Права доступа задаются в виде строки, например, «0660».

void sem_change_mode(int semid, char *mode) {

 int res;

 struct semid_ds semds;

 union semun opts;

 /* Нужно указать нашу локальную копию структуры */

 opts.buf = &semds;

 if ((res = semctl(semid, 0, IPC_STAT, opts)) == -1) {

printf("Error");

exit(1);

 }

 printf("Старые права доступа %o\n",

 opts.buf->sem_perm.mode);

 /* Изменяем права доступа */

 sscanf(mode, "%ho", &opts.buf->sem_perm.mode);

 /* Обновляем внутреннюю структуру */

 semctl(sid, 0, IPC_SET, opts);

}

26.7. Разделяемые сегменты памяти

Сегменты памяти разделяются между несколькими процессами.

Один процесс создает сегмент памяти, а другие в любом количестве — используют. Разделяемые сегменты памяти — это самый быстрый способ IPC.

Для каждого разделяемого сегмента памяти ядро поддерживает специальную структуру — shmid_ds, описанную в файле

/usr/src/linux/include/linux/shm.h
:

struct shmid_ds {

 struct ipc_perm shm_perm; /* права доступа */

 int shm_segsz; /* размеры сегмента в байтах */

 time_t shm_atime; /* время последней привязки */

 time_t shm_dtime; /* время последней отвязки */

 time_t shm_ctime; /* время последнего изменения */

 unsigned short shm_cpid; /* PID создателя */

 /* PID последнего процесса-пользователя сегмента */

 unsigned short shm_lpid;

 short shm_nattch; /* число привязок */

 unsigned short shm_npages;

 /* размеры сегмента (в страницах) */

 /* массив указателей на $frames -> S$*/

 unsigned long *shm_pages;

 struct vm_area_struct *attaches;

 /* дескрипторы для привязок */

};

Я немного сократил эту структуру, оставив описание только нужных нам полей. Полагаю, что вы в нем разберетесь. Возможно, вас заинтересовали термины «привязка» и «отвязка». Привязка — это размещение сегмента в адресном пространстве процесса, подключение к разделяемому сегменту памяти (РСП). Отвязка, соответственно, — отключение, Поле shm_nattch содержит количество привязок к РСП на данный момент.

Для создания нового РСП используется системный вызов shmget. Этот же вызов используется для подключения к уже существующему РСП.

int shmget(key_t key, int size, int shmflg);

Первый аргумент — это ключ IPC, полученный с помощью ftok, второй — размер РСП в байтах, а третий — флаги системного вызова shmget. Если установлен флаг IPC_CREAT, системный вызов создаст новый РСП или подключится к уже существующему сегменту, если обнаружится, что уже есть такой сегмент (с таким же значением ключа). Если установлен флаг IPC_EXCL вместе с IPC_CREAT (сам по себе он бесполезен) подключение к существующему РСП запрещается.

Системный вызов shmget возвращает идентификатор РСП или -1, если произошла ошибка. Переменная errno устанавливается так:

♦ EACCESS — не хватает полномочий для доступа к сегменту;

♦ EINVAL — неправильно заданы размеры сегмента;

♦ EEXISTS — сегмент уже существует, создание невозможно. Вы получите эту ошибку, если будете использовать флаг IPC_EXCL вместе с IPC_CREAT при условии, что сегмент уже существует;

♦ IDRM — сегмент помечен на удаление или уже удален;

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

Пипец Котенку! 2

Майерс Александр
2. РОС: Пипец Котенку!
Фантастика:
юмористическое фэнтези
попаданцы
аниме
5.00
рейтинг книги
Пипец Котенку! 2

Сотник

Ланцов Михаил Алексеевич
4. Помещик
Фантастика:
альтернативная история
5.00
рейтинг книги
Сотник

Второгодка. Книга 3. Ученье свет

Ромов Дмитрий
3. Второгодка
Фантастика:
городское фэнтези
сказочная фантастика
альтернативная история
5.00
рейтинг книги
Второгодка. Книга 3. Ученье свет

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

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

Двойник короля 20

Скабер Артемий
20. Двойник Короля
Фантастика:
аниме
фэнтези
попаданцы
5.00
рейтинг книги
Двойник короля 20

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

Сапфир Олег
39. Кодекс Охотника
Фантастика:
фэнтези
попаданцы
боевая фантастика
5.00
рейтинг книги
Кодекс Охотника. Книга XXXIX

Я еще не царь

Дрейк Сириус
25. Дорогой барон!
Фантастика:
юмористическое фэнтези
аниме
попаданцы
5.00
рейтинг книги
Я еще не царь

Зодчий. Книга II

Погуляй Юрий Александрович
2. Зодчий Империи
Фантастика:
аниме
фэнтези
попаданцы
5.00
рейтинг книги
Зодчий. Книга II

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

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

Наследник павшего дома. Том IV

Вайс Александр
4. Расколотый мир
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Наследник павшего дома. Том IV

Отморозок 5

Поповский Андрей Владимирович
5. Отморозок
Фантастика:
попаданцы
альтернативная история
5.00
рейтинг книги
Отморозок 5

Глубокий космос

Вайс Александр
9. Фронтир
Фантастика:
боевая фантастика
космическая фантастика
космоопера
5.00
рейтинг книги
Глубокий космос

Последний Паладин. Том 13

Саваровский Роман
13. Путь Паладина
Фантастика:
городское фэнтези
попаданцы
аниме
5.00
рейтинг книги
Последний Паладин. Том 13

Адвокат империи

Карелин Сергей Витальевич
1. Адвокат империи
Фантастика:
городское фэнтези
попаданцы
фэнтези
5.75
рейтинг книги
Адвокат империи