Управление процессами и нитями в ОС QNX. Основные принципы управления процессами и нитями в ОС QNX, страница 5

#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);

}