#include <stdio.h>
#include <stdlib.h>
#include <signal.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
void (*mysig(int sig, void(*handler)(void))) (int)
{
struct sigaction act,oldact;
act.sa_handler=handler;
sigemptyset(&act.sa_mask);
sigaddset(&act.sa_mask, SIGINT);
act.sa_flags=0;
if(sigaction(sig, &act, &oldact) < 0)
{
return(SIG_ERR);
}
return(oldact.sa_handler);
}
void sigusr_1(void)
{
printf("SIGUSR1, SIGINT blocked.....\n");
kill(getpid(), SIGINT);
sleep(20);
printf("end\n");
}
void sigusr_2(void)
{
printf("SIGUSR2, SIGINT blocked.....\n");
kill(getpid(), SIGINT);
sleep(20);
printf("end\n");
}
int main( void )
{
mysig( SIGUSR1, sigusr_1);
mysig( SIGUSR2, sigusr_2);
while(1) sleep(1);
return 0;
}
Результаты:
# ./sigact&
[1] 2146341
# kill -s SIGUSR1 2146341
# SIGUSR1, SIGINT blocked.....
# kill -s SIGUSR2 2146341
# SIGUSR2, SIGINT blocked.....
# kill -s SIGINT 2146341
# ps -l| grep sig
00000200 - 0 2146341 856108 - 10 0 - 636K - ? 00:0
0:00 sigact
# end
# ps -l| grep sig
[1] + Interrupt ./sigact
#
4. Сравните обработчики надежных и ненадежных сигналов.
Ненадежные сигналы - это те, для которых вызванный однажды обработчик сигнала не остается. Такие "сигналы-выстрелы" должны перезапускать обработчик внутри самого обработчика, если есть желание сохранить сигнал действующим. В случае надежных сигналов при отправке сигнала SIGINT в момент работы другого обработчика, блокирующего этот сигнал, по окончании работы этого обработчика запрос выполняется и процесс завершается (sigaction содержит аргумент old_action, с помощью которого можем сохранить, старое действие для сигнала, и восстановить его позже, если необходимо).
III. Неименованные каналы
Создайте неименованный канал в файле pipe.c посредством системного вызова pipe(2), который возвращает 2 файловых дескриптора filedes[0] для записи в канал и для чтения из канала filedes[1]. Доступ к дескрипторам канала может получить как процесс, вызвавший pipe() , так и его дочерние процессы.
Используйте следующий фрагмент кода:
#include <stdio.h>
#include <unistd.h>
if((err = pipe(filedes))
< 0)
{
printf("Father : can't create
pipe\n");
exit(-1);
}
printf("Father : pipe is created\n");
Организуйте программу так, чтобы процесс-потомок открывал на чтение
произвольный текстовый файл и записывал считываемую из него информацию в
созданный неименованный канал. В функции процесса-родителя будет входить
считывание из канала на стандартный вывод. Не забудьте о закрытии дескрипторов
после работы с каналом.
pipe.c
#include <stdio.h>
#include <unistd.h>
int main (int argc, char* argv[])
{
FILE *f_in;
if(argc < 2)
{
printf("ERR!!! No file name!!!!");
exit(1);
};
char *filename = argv[1];
int filedes[2];
char buf[256];
char buf_read[256];
int pid,err;
if((err = pipe(filedes)) < 0)
Уважаемый посетитель!
Чтобы распечатать файл, скачайте его (в формате Word).
Ссылка на скачивание - внизу страницы.