Главная

Популярная публикация

Научная публикация

Случайная публикация

Обратная связь

ТОР 5 статей:

Методические подходы к анализу финансового состояния предприятия

Проблема периодизации русской литературы ХХ века. Краткая характеристика второй половины ХХ века

Ценовые и неценовые факторы

Характеристика шлифовальных кругов и ее маркировка

Служебные части речи. Предлог. Союз. Частицы

КАТЕГОРИИ:






Удаление набора семафоров из системы с помощью команды ipcrm или системного вызова semctl().




Массив семафоров может продолжать существовать в системе и после завершения использовавших его процессов, а семафоры будут сохранять свое значение. Это способно привести к неправильному поведению программ, предполагающих, что семафоры были только что созданы и, следовательно, имеют нулевое значение. Необходимо удалять семафоры из системы перед запуском таких программ или перед их завершением. Для удаления семафоров можно воспользоваться командами ipcs и ipcrm, рассмотренными на предыдущем семинаре. Команда ipcrm в этом случае должна иметь вид ipcrm sem <IPC идентификатор>. Для этой же цели можно применять системный вызов semctl(), который умеет выполнять и другие операции над массивом семафоров.

Примеры программ

Программа 05-1

/* Программа 05-1 для иллюстрации работы с семафорами */

/* Эта программа получает доступ к одному системному семафору,ждет пока его значение не станет больше или равным 1 после запусков программы 05-2,

а затем уменьшает его на 1*/

#include<sys/types.h>

#include <sys/ipc.h>

#include <sys/sem.h>

#include <stdio.h>

int main()

{

int semid; /* IPC дескриптордлямассива IPC семафоров */

charpathname[] = "08-1a.c"; /* Имя файла, использующееся для генерации ключа. Файл с таким именем должен существовать в текущей директории */

key_tkey; /* IPCключ */

structsembufmybuf; /* Структура для задания операции над семафором */

/* Генерируем IPC ключ из имени файла 08-1a.c в текущей директориии номера экземпляра области разделяемой памяти 0 */

if((key = ftok(pathname,0)) < 0){

printf("Can\'t generate key\n");

exit(-1);

}

/* Пытаемся получить доступ по ключу к массиву семафоров, если он существует,или создать его из одного семафора, если он еще не существует, с правами доступаread & write для всех пользователей */

if((semid = semget(key, 1, 0666 | IPC_CREAT)) < 0){

printf("Can\'t get semid\n");

exit(-1);

}

/* Выполним операцию D(semid1,1) для нашего массива семафоров.Для этого сначала заполним нашу структуру. Флаг, как обычно, полагаем равным 0. Наш массив семафоров состоит из одного семафора с номером 0. Код операции -1.*/

mybuf.sem_op = -1;

mybuf.sem_flg = 0;

mybuf.sem_num = 0;

if(semop(semid, &mybuf, 1) < 0){

printf("Can\'t wait for condition\n");

exit(-1);

}

printf("Condition is present\n");

return 0;

}

 

Программа 05-2

/* Программа 2 для иллюстрации работы с семафорами */

/* Эта программа получает доступ к одному системному семафоруи увеличивает его значение на 1, чтобы разблокировать программу 1 */

#include <sys/types.h>

#include <sys/ipc.h>

#include <sys/sem.h>

#include <stdio.h>

int main()

{

int semid; /* IPC дескриптордлямассива IPC семафоров */

charpathname[] = "08-1a.c"; /* Имя файла, использующееся для генерации ключа. Файл с таким именем должен существовать в текущей директории */

key_tkey; /* IPCключ */

structsembufmybuf; /* Структура для задания операции над семафором */

/* Генерируем IPC ключ из имени файла 08-1a.c в текущей директориии номера экземпляра области разделяемой памяти 0 */

if((key = ftok(pathname,0)) < 0){

printf("Can\'t generate key\n");

exit(-1);

}

/* Пытаемся получить доступ по ключу к массиву семафоров, если он существует,или создать его из одного семафора, если он еще не существует, с правами доступаread & write для всех пользователей */

if((semid = semget(key, 1, 0666 | IPC_CREAT)) < 0){

printf("Can\'t get semid\n");

exit(-1);

}

/* Выполним операцию A(semid1,1) для нашего массива семафоров.Для этого сначала заполним нашу структуру. Флаг, как обычно, полагаем равным 0. Наш массив семафоров состоит из одного семафора с номером 0. Код операции 1.*/

mybuf.sem_op = 1;

mybuf.sem_flg = 0;

mybuf.sem_num = 0;

if(semop(semid, &mybuf, 1) < 0){

printf("Can\'t wait for condition\n");

exit(-1);

}

printf("Set condition\n");

return 0;

}






Не нашли, что искали? Воспользуйтесь поиском:

vikidalka.ru - 2015-2024 год. Все права принадлежат их авторам! Нарушение авторских прав | Нарушение персональных данных