[<<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   }