Изучение основных принципов управления процессами и нитями в ОС LINUX, страница 6

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).
Приведите примеры их использования.