Средства межпроцессорного взаимодействия, страница 6

#include "header.h"

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

            if(argc < 2) {

                        printf("%s: error code is 1\nNot enouth input arguments\n\n",argv[0]);

                        return 1;

            };

            obj.FName = argv[1];

            obj.name_server = argv[0];

            obj.chan_write = "chan1";

            obj.chan_read = "chan2";

            mode_t mode = S_IFIFO | 0666;

            int res = mknod (obj.chan_read,mode, 0);

            if (res<0) {

                        printf("%s: error code is 2\nError in creation FIFO, read channel, %s\n\n",obj.name_server,obj.chan_read);

                        return 2;

            };

            res = mknod (obj.chan_write,mode, 0);

            if (res<0) {

                        printf("%s: error code is 2\nError in creation FIFO, write channel, %s\n\n",obj.name_server,obj.chan_write);                       return 2;

            };

            int fd_read;

            int fd_write;

            printf("%s: both of channel FIFO has created\n\n",obj.name_server);

            fd_write = open(obj.chan_write,O_WRONLY);

            if (!fd_write) {

                        printf("%s: error code is 3\nError open file %s\n\n",obj.name_server,obj.chan_write);

                        return 3;

            };

            fd_read = open(obj.chan_read,O_RDONLY);

            if (!fd_read) {

                        printf("%s: error code is 3\nError open file %s\n\n",obj.name_server,obj.chan_read);

                        return 3;

            };

            server(fd_read,fd_write);

            close(fd_read);        

            close(fd_write);

            return 0;

};

Листинг 6.2. Листинг программы server.c (начало)

void server(int fdr, int fdw) {

            char buf[256];          

            int num;

            if (write(fdw,obj.FName,strlen(obj.FName))<0) {

                        printf("%s: error code is 4\nError writing in FIFO channel\n\n",obj.name_server);

                        exit(4);

            };

            while(1) {

                        num = read(fdr,buf,256);

                        if( num < 0) {

                                   printf("%s: error code is 5\nError read from FIFO channel\n\n",obj.name_server);

                                   exit(5);

                        };

                        if(buf[0] == '<' && buf[1] == '>') {

                                   break;

                        };

                        printf("%s has read %i bytes\n",obj.name_server,num);

                        printf("%s has recieved data: %s\n",obj.name_server,buf);

                        erase (buf);

            };

            printf("%s: end\n",obj.name_server);

            return;

};

Листинг 6.2. Листинг программы server.c (продолжение)

В качестве входного параметра, процедура принимает имя файла, содержимое которое будет передано клиентом через буфер FIFO. Поскольку сервер в общем случае рассчитан на работу с несколькими клиентами, посылающими наперебой свои запросы, обрабатывающая часть находится в вечном цикле. Выход осуществляется по факту приема оперирующего сигнала “<>”.

#include "header.h"

#include <signal.h>

void hndl_end(int);

void hndl_send(int);

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

            if(argc < 2) {

                        printf("%s: error code is 1\nNot enougth input arguments\n\n",argv[0]);

                        return 1;

            };

            int ch_read;

            int ch_write;

            obj.name_client = argv[0];

            obj.add_file = argv[1];