Главная

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

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

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

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

ТОР 5 статей:

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

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

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

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

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

КАТЕГОРИИ:






Написать фрагмент программы, которая показывает синхронизацию процессов с помощью семофоров




/* Программа 08-1a.c для иллюстрации работы с

семафорами */

/* Эта программа получает доступ к одному системному семафору,

ждет, пока его значение не станет больше или равным 1

после запусков программы 08-1b.c,а затем уменьшает его на 1*/

#include <sys/types.h>

#include <sys/ipc.h>

#include <sys/sem.h>

#include <stdio.h>

int main()

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

семафоров */

char pathname[] = "08-1a.c"; /* Имя файла,

использующееся для генерации ключа. Файл с таким

именем должен существовать в текущей директории */

key_t key; /* IPC ключ */

struct sembuf mybuf; /* Структура для задания

операции над семафором */

/* Генерируем IPC-ключ из имени файла 08-1a.c в текущей

директории и номера экземпляра массива семафоров 0 */

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

printf("Can′t generate key

");

exit(-1);

}

/* Пытаемся получить доступ по ключу к массиву

семафоров, если он существует, или создать его из одного

семафора, если его еще не существует, с правами доступа

read & write для всех пользователей */

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

printf("Can′t get semid

");

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

");

exit(-1);

}

printf("Condition is present

");

return 0;

}

 

/* Программа 08-1b.c для иллюстрации работы с

семафорами */

/* Эта программа получает доступ к одному системному семафору

и увеличивает его на 1*/

#include <sys/types.h>

#include <sys/ipc.h>

#include <sys/sem.h>

#include <stdio.h>

int main()

{

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

семафоров */

char pathname[] = "08-1a.c"; /* Имя файла,

использующееся для генерации ключа. Файл с таким

именем должен существовать в текущей директории */

key_t key; /* IPC ключ */

struct sembuf mybuf; /* Структура для задания операции

над семафором */

/* Генерируем IPC ключ из имени файла 08-1a.c в текущей

директории и номера экземпляра массива семафоров 0 */

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

printf("Can′t generate key

");

exit(-1);

}

/* Пытаемся получить доступ по ключу к массиву

семафоров, если он существует, или создать его из

одного семафора, если его еще не существует, с правами доступа

read & write для всех пользователей */

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

printf("Can′t get semid

");

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

");

exit(-1);

}

printf("Condition is set

");

return 0;

}

 

 






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

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