[<<Previous Entry]
[^^Up^^]
[Next Entry>>]
[Menu]
[About The Guide]
Игнорирование сигнала - пример - ожидание подпроцесса.
Этот пример является улучшением аналогичного примера, приведенного в
курсе Системные вызовы и библиотеки ОС UNIX - Часть 1 (UU1001). Эта
функция позволяет вам исполнить любую shell-команду из вашей
программы. Улучшение состоит в том, что эта функция устойчива к
сигналам SIGINT и SIGQUIT во время ожидания завершения порожденного
процесса.
10 Объявление переменных для сохранения значений, возвращаемых
функцией signal(2).
17-18 Реакции на сигналы SIGINT и SIGQUIT установлены на
игнорирование этих сигналов. Предыдущие установки этих
реакций сохранены в istat и qstat соответственно.
20-21 Функция ожидает завершения порожденного процесса. Если бы
вместо этого были получены два сигнала, то wait(2) прекратил
бы исполнение, и порожденный процесс по завершению
превратился бы в зомби.
23-24 Реакции на сигналы теперь восстановлены в их исходные
значения.
Эта функция может быть протестирована следующей драйверной функцией:
30 #if DEBUG
31 main() /* test command() function */
32 {
33 printf("%d\n", command("date > Date; cat Date"));
34 printf("%d\n", command("date -x"));
35 printf("%d\n", command("sleep 10; echo done"));
36 }
37 #endif
Файл: command.c
ИГНОРИРОВАНИЕ СИГНАЛА - ПРИМЕР - ОЖИДАНИЕ ПОДПРОЦЕССА
1 #include <sys/types.h>
2 #include <unistd.h>
3 #include <signal.h>
4 #include <wait.h>
5
6 command(char *cmd) /*run shell command from
7 {
8 pid_t chpid, w;
9 int status;
10 void (*istat)(int), (*qstat)(int);
11
12 if ((chpid = fork()) == 0) {
13 execlp("sh","sh","-c",cmd,(char *) 0);
14 exit(127);
15 }
16
17 istat = signal(SIGINT, SIG_IGN);
18 qstat = signal(SIGQUIT, SIG_IGN);
19
20 while ((w = wait(&status)) != chpid && w
21 ; /* null */
22
23 signal(SIGINT, istat);
24 signal(SIGQUIT, qstat);
25
26 return((w != -1) ? WEXITSTATUS(status) :
27 /* return((w != -1) ? (status >> 8) &
28 }