Кафедра тс и
Скачать 67.24 Kb.
|
имя_файла». Информация, поступившая до указанной строки, игнорируется. После поступления указанной строки сервер открывает файл, имя которого было передано, и выполняет обработку указанного файла согласно варианту задания (имя файла и задание взять из занятия 6). Далее, всё, что нашел сервер должно быть записано в новый файл. Процедура взаимодействия заканчивается отправкой клиенту имени созданного нового файла. |
#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 |
Результат работы программы (Запуск производится параллельно с двух терминалов)
Контрольные вопросы
Могут ли процессы получать непосредственный доступ к данным других процессов? Почему?
Программные каналы. Зачем нужны? Принцип функционирования.
Функция pipe.
Именованные каналы и их отличие от программных.
Функция mknod.
1. Множество возможных имён объектов конкретного типа межпроцессного взаимодействия называется пространством имён (англ. name space). Имена являются важным компонентом системы межпроцессного взаимодействия (англ. InterProcess Communications, IPC) для всех объектов, поскольку позволяют различным процессам получить доступ к общему объекту.
2. Программные каналы - это линии связи между двумя или более процессами. Процесс может посылать данные в канал при помощи системного вызова write, а другой процесс может принимать данные из канала при помощи системного вызова read.
3. Pipe (конвеер) – это однонаправленный канал межпроцессного взаимодействия.
4. В программировании именованный канал или именованный конвейер — один из методов межпроцессного взаимодействия, расширение понятия конвейера в Unix и подобных ОС.
Именованные канал позволяет различным процессам обмениваться данными, даже если программы, выполняющиеся в этих процессах, изначально не были написаны для взаимодействия с другими программами, в то время, как программный канал служит для установления односторонней связи, соединяющей один процесс с другим в пределах одной программы.
5. mknod создает FIFO (именованный канал), специальный символьный или специальный блочный файл