#include <signal.h>
#include <stdlib.h>
#include <sys/types.h>
main()
{
signal (SIGUSR1, SIG_DFL);
sleep(15);
}
son2.c – игнорорование получаемого сигнала.
#include <signal.h>
#include <stdlib.h>
#include <sys/types.h>
main()
{
signal (SIGUSR1, SIG_IGN);
sleep(15);
}
son3.c – “перехват” сигнала
#include <signal.h>
#include <stdlib.h>
#include <sys/types.h>
void answer();
main()
{
signal (SIGUSR1, answer);
sleep(10);
return 0;
}
void answer()
{
printf(" Son3 answer!\n");
sleep(10);
}
sigpr – скрипт для демонстрации работы 3 примеров.
#!/bin/ksh
make son1
make son2
make son3
make father
./father
Пример работы скрипта:
# ./sigpr
cc son1.c -o son1
cc son2.c -o son2
cc son3.c -o son3
cc father.c -o father
Son3 answer!
Результат работы скрипта в файле sig_log.txt.
UID PID PPID C STIME TTY TIME CMD
0 335894 2 - Nov23 ? 00:00:00 login
0 561175 479263 - Nov23 ? 00:00:10 pterm
0 434203 1 - Nov23 ? 00:00:06 pwm
0 561180 561175 - Nov23 ? 00:00:00 /bin/sh
0 479263 1 - Nov23 ? 00:00:17 shelf
0 479263 1 - Nov23 ? 00:00:17 shelf
0 516128 1 - Nov23 ? 00:00:00 bkgdmgr
0 516129 1 - Nov23 ? 00:00:01 wmswitch
0 516130 1 - Nov23 ? 00:00:06 saver
0 569379 479263 - Nov23 ? 00:00:05 pfm
0 4218916 561180 - Nov23 ? 00:00:00 /bin/ksh ./sigpr
0 4280357 4218916 - 21:07 ? 00:00:00 ./father
0 4284454 4280357 - 21:07 ? 00:00:00 son1
0 4284455 4280357 - 21:07 ? 00:00:00 son2
0 4296744 4284460 - 21:07 ? 00:00:00 ps -f
0 4284457 4280357 - 21:07 ? 00:00:00 son3
0 4284460 4280357 - 21:07 ? 00:00:00 sh -c sh
UID PID PPID C STIME TTY TIME CMD
0 335894 2 - Nov23 ? 00:00:00 login
0 561175 479263 - Nov23 ? 00:00:10 pterm
0 434203 1 - Nov23 ? 00:00:06 pwm
0 561180 561175 - Nov23 ? 00:00:00 /bin/sh
0 479263 1 - Nov23 ? 00:00:17 shelf
0 479263 1 - Nov23 ? 00:00:17 shelf
0 516128 1 - Nov23 ? 00:00:00 bkgdmgr
0 516129 1 - Nov23 ? 00:00:01 wmswitch
0 516130 1 - Nov23 ? 00:00:06 saver
0 569379 479263 - Nov23 ? 00:00:05 pfm
0 4218916 561180 - Nov23 ? 00:00:00 /bin/ksh ./sigpr
0 4280357 4218916 - 21:07 ? 00:00:00 ./father
0 4284455 4280357 - 21:07 ? 00:00:00 son2
0 4309032 4280357 - 21:07 ? 00:00:00 sh -c sh
0 4284457 4280357 - 21:07 ? 00:00:00 son3
0 4309034 4309032 - 21:07 ? 00:00:00 ps -f
Процесс son1 завершился, процесс son3 успешно перехватил сигнал от родительского процесса и вывел на стандартный выход сообщение.
Исследование времени получения сигнала процессом от его состояния:
send.c
#include <sys/types.h>
#include <stdlib.h>
#include <process.h>
main()
{
int i, pid[2], status;
time_t t;
if((pid[0]=vfork())==0) execl("./rec1","rec1", NULL);
if((pid[1]=vfork())==0) execl("./rec2","rec2", NULL);
for ( i=0;i<2;i++)
{
printf(" send: %i to rec%i\n", time(&t), i+1);
kill(pid[i], SIGUSR1);
waitpid( pid[i], &status, 0);
}
}
rec1.c– процесс в активном состоянии.
#include <signal.h>
#include <stdlib.h>
#include <sys/types.h>
int k;
void action();
main()
{
k=1;
signal (SIGUSR1, action);
while(k);
}
void action()
{
time_t t;
printf(" rec1:\t\t%i\n", time(&t));
k = 0;
exit(0);
}
Уважаемый посетитель!
Чтобы распечатать файл, скачайте его (в формате Word).
Ссылка на скачивание - внизу страницы.