ФЕДЕРАЛЬНОЕ ГОСУДАРСТВЕННОЕ БЮДЖЕТНОЕ ОБРАЗОВАТЕЛЬНОЕ
УЧРЕЖДЕНИЕ ВЫСШЕГО ОБРАЗОВАНИЯ
«САНКТ-ПЕТЕРБУРГСКИЙ ГОСУДАРСТВЕННЫЙ УНИВЕРСИТЕТ
ТЕЛЕКОММУНИКАЦИЙ ИМ. ПРОФ. М.А. БОНЧ-БРУЕВИЧА»
(СПбГУТ)
ФАКУЛЬТЕТ ИНФОКОММУНИКАЦИОННЫХ СЕТЕЙ И СИСТЕМ (ИКСС)
КАФЕДРА ПРОГРАММНОЙ ИНЖЕНЕРИИ И ВЫЧИСЛИТЕЛЬНОЙ ТЕХНИКИ (ПИ И ВТ)
ДИСЦИПЛИНА: «Операционные системы и сети»
Лабораторная работа №5.
Разработка многопроцессорной программы под Linux
Выполнил:
Цыганков М.А.
Козлов Н.С.
Тюришев М.А.
Подпись____________
Принял:
Дагаев А.В.
Подпись____________
«_____»________ 2021
Цель работы
Разработать программу, использующую несколько процессов и объекты синхронизации под Linux.
Постановка задачи
Написать две программы, одна из которых будет переводить семафор в сигнальное состояние (сделает его значение больше и равным 1), а вторая будет ждать перехода этого семафора в сигнальное состояние.
Демонстрация работы
Рис. 1 – 2 программа запущена, семафор в несигнальном состоянии
Рис. 2 – 1 программа запущена, семафор перешел в сигнальное состояние
Код программы
/*08-1a.c*/
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/sem.h>
#include <stdio.h>
int main()
{
int semid;
char pathname[] = "08-1a.c";
key_t key;
struct sembuf mybuf;
if ((key = ftok(pathname, 0)) < 0) {
printf("Can\'t generate key\n");
exit(-1);
}
if ((semid = semget(key, 1, 0666 | IPC_CREAT)) < 0) {
printf("Can\'t get semid\n");
exit(-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 set\n");
return 0;
}
/*08-1b.c*/
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/sem.h>
#include <stdio.h>
int main()
{
int semid;
char pathname[] = "08-1b.c";
key_t key;
struct sembuf mybuf;
if ((key = ftok(pathname, 0)) < 0) {
printf("Can\'t generate key\n");
exit(-1);
}
if ((semid = semget(key, 1, 0666 | IPC_CREAT)) < 0) {
printf("Can\'t get semid\n");
exit(-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;
}
