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

Листинг 6.3. Программа client.c (начало)

            printf("%s: pid is %i\n\n",obj.name_client,getpid());

            signal(SIGUSR1,hndl_end);

            signal(SIGUSR2,hndl_send);

            if ((ch_read = open("chan1",O_RDONLY))<0) {

                        printf("%s: error code is 1\nError opening file chan1\n\n",obj.name_client);

                        exit(1);

            };

            if ((ch_write = open("chan2",O_WRONLY))<0) {

                        printf("%s: error code is 1\nError opening file chan2\n\n",obj.name_client);

                        exit(1);

            };

            obj.fdw = ch_write;

            obj.flag = 0;

            client(ch_read,ch_write);

            close(ch_read);

            close(ch_write);

            unlink("chan1");

            unlink("chan2");

            return 0;

};

void client(int fdr, int fdw){

            char FileName[64];

            char temp[256];

            int num = 10;

            int FileID;

            read (fdr,FileName,64);

            printf("%s: recieved file name %s\n",obj.name_client,FileName);

            while(1) {

                        FileID = open(FileName,O_RDONLY);

                        if (FileID<0) {

                                   printf("%s: error code is 7\nError opening file %s\n",obj.name_client,FileName);

                                   exit(7);

                        };

                        num = read(FileID,temp,sizeof(temp));

                        close(FileID);

                        printf("%s: data to send: %s\n",obj.name_client,temp);

                        write(fdw,temp,strlen(temp));

                        while(1) {

                                   if(obj.flag == 1 || obj.flag == 2) {

                                               break;

                                   };

                        };

                        if(obj.flag == 1) {break;};

                        if(obj.flag == 2) {

                                   obj.flag = 0;

                                   erase (FileName);

                                   erase (temp);

Листинг 6.3. Программа client.c (продолжение)

                                   int k=0;

                                   while(obj.add_file[k]) {

                                               FileName[k] = obj.add_file[k];

                                               k ++;

                                   };

                        };

            };

            return;

};

void hndl_end(int nomer) {

            write(obj.fdw,”<>”,5);

            obj.flag = 1;

            printf(“%s: end\n”,obj.name_client);

};

void hndl_send(int nomer) {

            obj.flag = 2;

            printf(“%s: new open file is %s\n\n”,obj.name_client,obj.add_file);

};

Листинг 6.3. Программа client.c (окончание)

Помимо FIFO здесь также использованы обработчики пользовательских сигналов SIGUSR1 и SIGUSR2. Посылка данных в буфер fifo также организована циклом. Пользователь может прервать его, послав сигнал USR1 с терминала, после чего сгенерируется посылка “<>” для сервера и обе программы завершат свою работу. Сигнал SIGUSR2 позволяет передать в буфер дополнительные данные из файла (в зависимости от пользовательского ввода). Рассмотрим содержимое файлов input.txt и input2.txt.