Главная страница
Навигация по странице:

  • Взаимодействие

  • \n\t

  • \n

  • Кафедра тс и


    Скачать 67.24 Kb.
    НазваниеКафедра тс и
    Дата28.11.2022
    Размер67.24 Kb.
    Формат файлаodt
    Имя файлаGurickyAA_IA-032_lab10.odt
    ТипДокументы
    #816699


    Федеральное агентство связи

    Сибирский Государственный Университет Телекоммуникаций и Информатики

    Кафедра ТС и ВС

    Лабораторная работа 10


    Взаимодействие процессов. Каналы. FIFO
    По дисциплине: Операционныесистемы
    Выполнил: Гурицкий Артём Андреевич

    Группа: ИА-032

    Вариант: 1


    Проверила: МоренковаОльгаИльинична

    Новосибирск, 2022г.

    Заданиеналабораторнуюработу

      1. Написать две программы, использующие именованные каналы для обмена информацией. Назовем их условно «клиент» и «сервер»

      2. Клиент и сервер должны иметь общий заголовочный файл, определяющий требуемые соглашения (имя FIFO, длины строк и т.д.).

      3. Сервер создаёт именованный канал согласно соглашению и ждёт поступления от клиента строки формата:

    «FILENAMEимя_файла». Информация, поступившая до указанной строки, игнорируется. После поступления указанной строки сервер открывает файл, имя которого было передано, и выполняет обработку указанного файла согласно варианту задания (имя файла и задание взять из занятия 6). Далее, всё, что нашел сервер должно быть записано в новый файл. Процедура взаимодействия заканчивается отправкой клиенту имени созданного нового файла.

      1. Клиент выводит приглашение пользователю для ввода имени файла, после чего формирует строку указанного формата и передаёт её серверу. После получения итогового сообщения от сервера клиент выводит информацию из файла на экран.


    Serv.c

    Серверная часть, в котороый у нас создается файл FIFO, обрабатывается файл, название которого было передано из клентской части; а также из серверной части передается название нового файла, в которую была записана информация по нужному поезду.

    #include "header.h" typedef struct Train { char *path; int trainNum; char *time; } Train; bool scmp(char *array_1, const char *array_2) { while (*array_1 != '\0' || *array_2 != '\0') { if (*array_1 == *array_2) { array_1++; array_2++; continue; } else return false; } return true; } bool findInfo(FILE *file, int numOfTrain, Train *train) { char numChar[10]; sprintf(numChar, "%d:", numOfTrain); char res[255]; int c, k; while (c = getc(file) != EOF) { fscanf(file, "%s", res); if (scmp(res, numChar)) { fscanf(file, "%s", res); fscanf(file, "%s", train->path); fscanf(file, "%s", res); fscanf(file, "%d", &train->trainNum); fscanf(file, "%s", res); fscanf(file, "%s", res); fscanf(file, "%s", train->time); return true; } } return false; } int main (void){ int fd, n; char buff[MAX_BUF]; if (mknod(FIFO, S_IFIFO | 0666, 0) < 0) { printf("Impossible to create file FIFO\n"); exit(1); } if ((fd = open(FIFO, O_RDWR)) < 0) { printf("Can not open FIFO file\n"); exit(1); } read(fd, buff, MAX_BUF); FILE *file_in; file_in = fopen(buff, "rb"); FILE *file_out = fopen("NewTrain", "w+"); Train *tr = malloc(100); tr->path = malloc(20); tr->time = malloc(20); int numTrain; printf("Input number of train: "); scanf("%d", &numTrain); if (findInfo(file_in, numTrain, tr)) { fprintf(file_out, "%d:\n\t%s\n\t%d\n\t%s\n", tr->trainNum, tr->path, tr->trainNum, tr->time); } write(fd, "NewTrain", MAX_BUF); close(file_in); close(file_out); exit(0); }


    Client.c

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

    #include "header.h" int main (void) { int fd, n; char fileName[MAX_BUF]; char outFile[MAX_BUF]; ssize_t bytes_read; if ((fd = open(FIFO, O_RDWR)) < 0){ printf("Can not open FIFO file\n"); exit(1); } printf("Input file name: "); gets(fileName); if (write(fd, fileName, 10) > MAX_BUF){ printf("Writing error\n"); exit(1); } read(fd, outFile, MAX_BUF); printf("%s\n", outFile); FILE *file = fopen("NewTrain", "r"); char *arr = malloc(sizeof(char) * 1000); while (fgets(arr, 2, file)) { printf("%s", arr); } if (unlink(FIFO) < 0) { printf("FIFO file can not to delete\n"); exit(1); } exit (0); }


    Header.h

    #include #include #include #include #include #include #include #include #define FIFO "fifo" #define MAX_BUF 1024




    Результат работы программы (Запуск производится параллельно с двух терминалов)



    Контрольные вопросы

    1. Могут ли процессы получать непосредственный доступ к данным других процессов? Почему?

    2. Программные каналы. Зачем нужны? Принцип функционирования.

    3. Функция pipe.

    4. Именованные каналы и их отличие от программных.

    5. Функция mknod.


    1. Множество возможных имён объектов конкретного типа межпроцессного взаимодействия называется пространством имён (англ. name space). Имена являются важным компонентом системы межпроцессного взаимодействия (англ. InterProcess Communications, IPC) для всех объектов, поскольку позволяют различным процессам получить доступ к общему объекту.

    2. Программные каналы - это линии связи между двумя или более процессами. Процесс может посылать данные в канал при помощи системного вызова write, а другой процесс может принимать данные из канала при помощи системного вызова read.

    3. Pipe (конвеер) – это однонаправленный канал межпроцессного взаимодействия.

    4. В программировании именованный канал или именованный конвейер — один из методов межпроцессного взаимодействия, расширение понятия конвейера в Unix и подобных ОС.

    Именованные канал позволяет различным процессам обмениваться данными, даже если программы, выполняющиеся в этих процессах, изначально не были написаны для взаимодействия с другими программами, в то время, как программный канал служит для установления односторонней связи, соединяющей один процесс с другим в пределах одной программы.

    5. mknod создает FIFO (именованный канал), специальный символьный или специальный блочный файл


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