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

Листинг 4. Модификация программы sigact.c – программа sigact_1.c

Изменению подверглась процедура изменения диспозиции сигналов и обработчик пользовательского сигнала SIGUSR1. Теперь при попадании в него генерируется прерывание процесса посредством системного вызова kill (getpid(), SIGINT). После чего процесс засыпает. Рассмотрим пример вызова программы и проанализируем полученные результаты.

Запуск и анализ результатов:

$ gcc -o sig_1 sigact_1.c

$ ./sig_1&

[1] 5439526

$ kill -s SIGUSR1 5439526

SIGINT: is blocked

$ pidin -p 5439526

     pid tid name               prio STATE       Blocked

 5439526   1 ./sig_1             10r NANOSLEEP

SIGINT: is ready

$ pidin -p 5439526

     pid tid name               prio STATE       Blocked

pidin: couldn't open /proc/5439526/as: No such file or directory

[1] + Interrupt            ./sig_1

Во время сна процесс еще существовал, после его ‘отмирания’ был немедленно уничтожен пришедшим до засыпания сигналом SIGINT.


5.  Неименованные каналы

#include <stdio.h>

#include <unistd.h>

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

            if(argc < 2) {

                        printf("Pipe.c: not enouth input args\n");

                        exit(1);

            };

            char *FName;

            FName = argv[1];

            char str_f[256];

            char str_p[256];

            int filedes[2];

            int pid,err;

            if((err = pipe(filedes)) < 0) {

                        printf("Pipe.c: error while create pipe\n");

                        exit(1);

            };

            pid = fork();

            if (!pid) {

                        printf("Pipe.c: son\n");

                        int input = fopen(FName,"r");

                        if (input <=0) {

                                   printf("Pipe.c: error while open file [%s]\n",FName);

                                   exit(1);

                        } else {

                                   printf("Pipe.c: file [%s] is open\n",FName);

                                   fscanf(input,"%s",str_f);

                                   write(filedes[1],str_f,strlen(str_f));

                                   printf("Pipe.c: write data [%s] to pipe\n",str_f);

                                   close(input);

                                   close(filedes[1]);

                        };

                        return 0;

            } else {

                        printf("\nPipe.c: father\n");

                        read (filedes[0],str_p,30);

                        close(filedes[0]);

                        printf("Pipe.c: read from pipe %s\n",str_p);

            };

            return 0;

}

Листинг 5.1. Программа pipe.c

kekeke

l

Листинг 5.2. Файл Input.txt

WOW! go into the pipe!)))! ^^

Листинг 5.3. Файл Input.2

Пользователь указывает имя файла в качестве параметра программы. В случае ошибки ввода или же преднамеренно-неверного указания файла, произойдет ошибка. Программа работает с уже созданными файлами. Тестирование проводилось на основе двух файлов – Input.txt и Input.2 В первом случае – это три строчки, в последней из которых содержится один пробел. Во втором – одна строчка.

Рассмотрим работу программы: