Главная страница

Лабораторная работа по системному ПО. Генерация текстовых сообщений. Злобин.Системное ПО. ЛР №2. Лабораторная работа защищена с оценкой


Скачать 99.31 Kb.
НазваниеЛабораторная работа защищена с оценкой
АнкорЛабораторная работа по системному ПО. Генерация текстовых сообщений
Дата13.01.2023
Размер99.31 Kb.
Формат файлаdocx
Имя файлаЗлобин.Системное ПО. ЛР №2 .docx
ТипЛабораторная работа
#884271

ФЕДЕРАЛЬНОЕ АГЕНТСТВО ВОЗДУШНОГО ТРАНСПОРТА (РОСАВИАЦИЯ)

ФЕДЕРАЛЬНОЕ ГОСУДАРСТВЕННОЕ БЮДЖЕТНОЕ ОБРАЗОВАТЕЛЬНОЕ УЧРЕЖДЕНИЕ ВЫСШЕГО ОБРАЗОВАНИЯ

«МОСКОВСКИЙ ГОСУДАРСТВЕННЫЙ ТЕХНИЧЕСКИЙ УНИВЕРСИТЕТ ГРАЖДАНСКОЙ АВИАЦИИ» (МГТУ ГА)

Кафедра вычислительных машин, комплексов, сетей и систем

Лабораторная работа защищена с оценкой

______________________

______________________

(подпись преподавателя, дата)
Лабораторная работа №2

По дисциплине “Системное программное обеспечение”

Тема: ОС Linux: программирование на языке командного интерпретатора. Однонаправленная передача текстовой информации

Выполнил

студент группы ЭВМ 3-1

Злобин Н.А.

(Ф.И.О.)

Руководитель:

к.т.н., доцент Романчева Н.И.

(звание, степень, Ф.И.О)


Москва- 2022

ОС Linux: программирование на языке командного интерпретатора. Однонаправленная передача текстовой информации

Цель лабораторной работы:

Изучение средств организации взаимодействия процессов из состава средств System V IPC.

Ход работы:

1.Разработать две программы 1a.c и 1b.c:

а) Первая из этих программ посылает пять текстовых сообщений с типом 1 и одно сообщение нулевой длины с типом 255 второй программе.

б) Вторая программа в цикле принимает сообщения любого типа в порядке FIFO и печатает их содержимое до тех пор, пока не получит сообщение с типом 255. Сообщение с типом 255 служит для нее сигналом к завершению работы и ликвидации очереди сообщений. Если перед запуском любой из программ очередь сообщений еще отсутствовала в системе, то программа создаст ее.

2.Выполнить компиляцию файлов 1a.c и 1b.c и проверить правильность их поведения. Следует обратить внимание на использование сообщения с типом 255 в качестве сигнала прекращения работы второго процесса. Это сообщение имеет нулевую длину, так как его информативность исчерпывается самим фактом наличия сообщения.

3.Выполнить модификацию предыдущих программ для передачи числовой информации.

  1. Разработать программу 1a.c для генерации сообщений

#include

#include

#include

#include

#include

#include

#define LAST_MESSAGE 255 // Тип сообщения для прекращения работы программы

int main()

{

int msqid; /* IPC дескриптор для очереди сообщений */

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

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

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

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

int i,len; /* Счетчик цикла и длина

информативной части сообщения */

/* Ниже следует пользовательская структура для

сообщения */

struct mymsgbuf

{

long mtype;

char mtext[81];

} mybuf;

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

директории и номера экземпляра очереди сообщений 0. */

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

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

exit(-1);

}

/* Пытаемся получить доступ по ключу к очереди сообщений,

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

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

if((msqid = msgget(key, 0666 | IPC_CREAT)) < 0){

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

exit(-1);

}

/* Посылаем в цикле 5 сообщений с типом 1

в очередь сообщений, идентифицируемую msqid.*/

for (i = 1; i <= 5; i++){

/* Сначала заполняем структуру для нашего

сообщения и определяем длину информативной части */

mybuf.mtype = 1;

strcpy(mybuf.mtext, "This is text message");

len = strlen(mybuf.mtext)+1;

/* Отсылаем сообщение. В случае ошибки сообщаем об

этом и удаляем очередь сообщений из системы. */

if (msgsnd(msqid, (struct msgbuf *) &mybuf,

len, 0) < 0){

printf("Can\'t send message to queue\n");

msgctl(msqid, IPC_RMID,

(struct msqid_ds *) NULL);

exit(-1);

}

}

/* Отсылаем сообщение, которое заставит получающий процесс

прекратить работу, с типом LAST_MESSAGE и длиной 0 */

mybuf.mtype = LAST_MESSAGE;

len = 0;

if (msgsnd(msqid, (struct msgbuf *) &mybuf,

len, 0) < 0){

printf("Can\'t send message to queue\n");

msgctl(msqid, IPC_RMID,

(struct msqid_ds *) NULL);

exit(-1);

}

return 0;

}



Рис. 1. Программа на языке C для получения атрибутов процесса uid и euid, написанная в среде GNU Nano



2.Разработать программу 1b.c для вывода сгенерированных сообщений

#include

#include

#include

#include

#include

#include

#define LAST_MESSAGE 255 /* Тип сообщения для

прекращения работы */

int main()

{

int msqid; /* IPC дескриптор для очереди сообщений */

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

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

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

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

int len, maxlen; /* Реальная длина и максимальная

длина информативной части сообщения */

/* Ниже следует пользовательская структура для сообщения */

struct mymsgbuf

{

long mtype;

char mtext[81];

} mybuf;

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

директории и номера экземпляра очереди сообщений 0 */

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

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

exit(-1);

}

/* Пытаемся получить доступ по ключу к очереди сообщений,

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

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

if((msqid = msgget(key, 0666 | IPC_CREAT)) < 0){

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

exit(-1);

}

while(1){

/* В бесконечном цикле принимаем сообщения

любого типа в порядке FIFO с максимальной длиной информативной

части 81 символ до тех пор, пока не поступит сообщение с

типом LAST_MESSAGE*/

maxlen = 81;

if(len = msgrcv(msqid,(struct msgbuf *) &mybuf, maxlen, 0, 0) < 0){

printf("Can\'t receive message from queue\n");

exit(-1);

}

/* Если принятое сообщение имеет тип LAST_MESSAGE,

прекращаем работу и удаляем очередь сообщений из

системы. В противном случае печатаем текст принятого

сообщения. */

if (mybuf.mtype == LAST_MESSAGE){

msgctl(msqid, IPC_RMID,

(struct msqid_ds *) NULL);

exit(0);

}

printf("message type = %ld, info = %s\n",

mybuf.mtype, mybuf.mtext);

}

return 0; /* Исключительно для отсутствия

warning'ов при компиляции. */

}


3.Поочередно запустить программы 1a и 1b и проверить результат работы.




Рис. 1. Результат выполнения программ


4. Модифицировать программы для передачи числовой информации

Листингфайла 2a.c

include

#include

#include

#include

#include

#include

#define LAST_MESSAGE 255 // Тип сообщения для прекращения работы программы

struct mymsgbuf

{

long mtype;

struct

{

short sinfo;

float finfo;

}info;

}mybuf;

int main()

{

int msqid; /* IPC дескриптор для очереди сообщений */

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

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

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

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

int i,len; /* Счетчик цикла и длина

информативной части сообщения */

/* Ниже следует пользовательская структура для

сообщения */

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

директории и номера экземпляра очереди сообщений 0. */

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

{

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

exit(-1);

}

/* Пытаемся получить доступ по ключу к очереди сообщений,

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

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

if((msqid = msgget(key, 0666 | IPC_CREAT)) < 0){

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

exit(-1);

}

/* Посылаем в цикле 5 сообщений с типом 1

в очередь сообщений, идентифицируемую msqid.*/

for (i = 1; i <= 5; i++){

/* Сначала заполняем структуру для нашего

сообщения и определяем длину информативной части */

mybuf.mtype = 1;

mybuf.info.sinfo=40+i;

mybuf.info.finfo=78.24+i;

len=sizeof(mybuf);

/* Отсылаем сообщение. В случае ошибки сообщаем об

этом и удаляем очередь сообщений из системы. */

if (msgsnd(msqid, (struct msgbuf *) &mybuf,

len, 0) < 0){

printf("Can\'t send message to queue\n");

msgctl(msqid, IPC_RMID,

(struct msqid_ds *) NULL);

exit(-1);

}

}

/* Отсылаем сообщение, которое заставит получающий процесс

прекратить работу, с типом LAST_MESSAGE и длиной 0 */

mybuf.mtype = LAST_MESSAGE;

len = 0;

if (msgsnd(msqid, (struct msgbuf *) &mybuf,

len, 0) < 0){

printf("Can\'t send message to queue\n");

msgctl(msqid, IPC_RMID,

(struct msqid_ds *) NULL);

exit(-1);

}

return 0;

}

Листингфайла 2b.c

#include

#include

#include

#include

#include

#include

#define LAST_MESSAGE 255 /* Тип сообщения для

прекращения работы */

struct mymsgbuf

{

long mtype;

struct

{

short sinfo;

float finfo;

}info;

}mybuf;

int main()

{

int msqid; /* IPC дескриптор для очереди сообщений */

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

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

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

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

int len, maxlen; /* Реальная длина и максимальная

длина информативной части сообщения */

/* Ниже следует пользовательская структура для сообщения */

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

директории и номера экземпляра очереди сообщений 0 */

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

{

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

exit(-1);

}

if((msqid = msgget(key, 0666 | IPC_CREAT)) < 0)

{

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

exit(-1);

}

while(1){

maxlen = sizeof(mybuf);

if(len = msgrcv(msqid,

(struct msgbuf *) &mybuf, maxlen, 0, 0) < 0){

printf("Can\'t receive message from queue\n");

exit(-1);

}

if (mybuf.mtype == LAST_MESSAGE){

msgctl(msqid, IPC_RMID,

(struct msqid_ds *) NULL);

exit(-1);

}

printf("message type = %d, sinfo = %d, finfo=%f\n",

mybuf.mtype,

mybuf.info.sinfo,

mybuf.info.finfo);

}

return 0;

}


Рис.2. Результат работы модифицированной программы


написать администратору сайта