Операционные системы реального времени. Программно-аппаратный экспериментальный комплекс, в составе которого инструментальный компьютер, страница 2

Текст программы.

#include <stdio.h>

#include <stdlib.h>

void main (int argc, char *argv[])

{

int desfilepipe[2],pid;

FILE *file1, *file2;

char *namef = argv[1];

char *namef2 = argv[2];

char buf1[50], buf2[50];

if (pipe(desfilepipe)==-1)

{ printf("can't create pipe\n");

exit(0);

}

else

{ printf ("pipe created\n");

}

pid=fork();

if(pid==-1)

{ printf("can't fork\n");

exit(0);

}

else if (pid==0)

{

file1=fopen(namef,"r");

if(file1==NULL)

{

printf ("son can't open file\n");

exit(0);

}

else {

int i=0;

while ((fscanf(file1,"%c",&buf1[i]))!=EOF)

i++;

close (file1);

write(desfilepipe[1],buf1,strlen(buf1));

close (desfilepipe[1]);

}

}

else

{

read(desfilepipe[0],buf2,sizeof(buf2));

close(desfilepipe[0]);

printf("father read: %s \n", buf2);

file2=fopen(namef2,"w");

if(file2==NULL)

{

printf ("father can't open file\n");

exit(0);

}

else {

fprintf(file2,buf2);

close (file2);

}

}

return;

}

1.3. Именованные каналы.

В файле server.c в основной программе:

Создайте 2 именованных канала, используя системный вызов mknod(), аргументы которого: имя файла FIFO в файловой системе; флаги владения, прав доступа (установите открытые для всех права доступа на чтение и на запись  S_IFIFO | 0666). Откройте один канал на запись (chan1), другой - на чтение (chan2) и запустите серверную часть программы server(fdr, fdw); закройте файловые дескрипторы.

В серверной части программы:

Запишите имя файла в канал 1 (для записи) функцией write(); прочитайте данные из канала 2 в зарезервированный ранее буфер.

В файле  client.c запрограммируйте в основной программе функции: открытия каналов для чтения (chan1) и записи (chan2); инициации клиентской части программы client(fdr, fdw); закрытия файловых дескрипторов и удаления каналов системным вызовом unlink(chan n).

В клиентской части программы: чтение имени файла из канала 1, сообщение серверу о начале записи, открытие канала 2 и запись в него данных, прочитанных из файла.

Откомпилируйте программы (gcc -o server server.c; gcc -o client client.c) Запустите на выполнение исполняемые модули ./server и ./client.

/* server.c */

#include <stdio.h>

#include <unistd.h>

#include <sys/stat.h>

#include <sys/types.h>

#include <fcntl.h>

int main(int argc, char* argv[]){

/* Filename of chanel */

char fn_write[] = "chanel1";

char fn_read[] = "chanel2";

/* File des. of chanel */

int fd_write;

int fd_read;

char mes[255];

unlink(fn_write);

unlink(fn_read);

/* Check arguments */

if(argc < 2){

printf("from server: must be two arguments\n");

return -1;

}

/* Create file for fifo */

// if ( mkfifo(fn_write, S_IFIFO | 0666) == -1 ){

if ( mknod(fn_write, 0010666, 0) == -1 ){

printf("from server: can't create fifo %s\n",fn_write);

return 1;

}

// if ( mkfifo(fn_read, S_IFIFO | 0666) == -1 ){

if ( mknod(fn_read, 0010666, 0) == -1 ){

printf("from server: can't create fifo %s\n",fn_read);

return 2;

}

/* Open fifo chanel */

if( (fd_write = open(fn_write,O_WRONLY)) == NULL ){

printf("from server: can't open %s\n",fn_write);

return 3;

}

if( (fd_read = open(fn_read,O_RDONLY)) == NULL ){

printf("from server: can't open %s\n",fn_read);

return 4;

}

/* SERVER PART */

/* Send name of file */

if( write(fd_write, argv[1], sizeof(argv[1])) == -1 ){

printf("from server: can't send name of file\n");

return -1;

}

/* Receive text from file */

if( read(fd_read, mes, sizeof(mes)) <= 0 ){

printf("from server: can't read mes\n");

}

else{

printf("from server: Receive text:\n%s\n",mes);

}

close(fd_read);

close(fd_write);