00000000 - 100 720945 716845 - 10 0 - 636K - ? 00:00:00 son3.out
00000000 - 100 737330 737328 - 10 0 - 648K - ? 00:00:00 ps
SIGUSR1_handler running!
after signal sent
F S UID PID PPID C PRI NI ADDR SZ WCHAN TTY TIME CMD
00000210 - 100 450581 368671 - 10 0 - 4612K - ? 00:00:01 helpviewer
...
00000000 - 100 716845 491559 - 10 0 - 636K - ? 00:00:00 father.out
00000000 - 100 720943 716845 - 10 0 - 636K - ? 00:00:00 son2.out
00000000 - 100 753712 716845 - 10 0 - 844K - ? 00:00:00 sh
00000000 - 100 753714 753712 - 10 0 - 648K - ? 00:00:00 ps
Видно, что продолжил выполняться после получения сигналов лишь тот процесс, для которого мы установили реакцию игнорирования.
3.3.2. Организуйте посылку
сигналов любым двум процессам, находящимся в разных состояниях: активном и
пассивном, фиксируя моменты посылки и приема каждого сигнала с точностью до
секунды.
Текст программы son1.c (пассивный).
#include <signal.h>
#include <stdio.h>
#include <time.h>
void SIGUSR1_handler (int sig_no)
{
time_t st_t;
st_t=time(NULL);
printf ("son1 (sleeping) received the signal at time %s\n", ctime(&st_t));
}
main ()
{
signal (SIGUSR1, SIGUSR1_handler);
printf ("son1 running\n");
sleep(10);
}
Текст программы son2.c (активный).
#include <stdio.h>
#include <signal.h>
#include <time.h>
void SIGUSR1_handler (int sig_no)
{
time_t st_t;
st_t=time(NULL);
printf ("son1 (active) received the signal at time %s\n", ctime(&st_t));
exit(0);
}
main ()
{
signal (SIGUSR1, SIGUSR1_handler);
printf ("son2 running\n");
while (1)
{}
}
Текст программы father.c (родительский процесс).
#include <signal.h>
#include <stdio.h>
main ()
{
int pid1, pid2, pid3;
pid1=fork();
if (pid1==0)
execl ("son1.out","son1.out",NULL);
pid2=fork();
if (pid2==0)
execl ("son2.out","son2.out",NULL);
printf ("father running\n");
system("ps");
kill (pid1,SIGUSR1);
kill (pid2,SIGUSR1);
time_t st_t;
st_t=time(NULL);
printf ("signals sended at time %s\n", ctime(&st_t));
sleep(2);
system("ps");
}
Результаты выполнения.
$ ./father.out
father running
son1 running
son2 running
PID TTY TIME CMD
1572885 ? 00:00:00 pterm
…
3596334 ? 00:00:00 father.out
3600431 ? 00:00:00 son1.out
3600432 ? 00:00:07 son2.out
3608625 ? 00:00:00 ps
3600435 ? 00:00:00 sh
signals sended at time Thu Dec 16 04:51:04 2010
son1 (active) received the signal at time Thu Dec 16 04:51:04 2010
son1 (sleeping) received the signal at time Thu Dec 16 04:51:04 2010
PID TTY TIME CMD
1572885 ? 00:00:00 pterm
…
3596334 ? 00:00:00 father.out
3620913 ? 00:00:00 sh
3620914 ? 00:00:00 ps
Видно, что с точностью до секунды, сигналы были посланы и приняты одновременно.
3.3.3. Ознакомьтесь с
выполнением команды и системного вызова nice(1) и getpriority(2).
Приведите примеры их использования.
Уважаемый посетитель!
Чтобы распечатать файл, скачайте его (в формате Word).
Ссылка на скачивание - внизу страницы.