Сигналы для управления заданиями



В ОС UNIX System V Версия 4 доступны сигналы, которые полезны в программах, реализующих интерактивное управление процессами первого плана (foreground) и фоновыми (background) процессами. Эти механизмы используются, главным образом, при реализации управления заданиями в командных процессорах. При помощи этих сигналов интерпретатор shell SVR4 позволяет пользователю делать такие операции, как приостановка процесса первого плана, перевод его в фоновый режим, или фонового процесса на первый план (foreground). Два сигнала, SIGSTOP и SIGTSTP вынуждают получивший процесс остановиться. SIGTSTP генерируется терминальным драйвером, при нажатии клавиши, заданной в c_cc[VSUSP] (<CTRL Z> по умолчанию) (см. termios(2), ioctl(2), <termios.h>). Посланный с терминала SIGTSTP заставляет процессы, входящие в основную (foreground) группу остановиться. SIGCONT возобновляет выполнение приостановленного процесса.

Если фоновый процесс не задерживает и не игнорирует SIGTTIN, система будет посылать SIGTTIN этому процессу при попытках выполнить read(2) с управляющего терминала. Если процесс игнорирует или задерживает SIGTTIN, read(2) возвращает неуспех, и устанавливает errno в EIO, (в предыдущих версий ОС UNIX System V, read(2) с терминала из фонового процесса немедленно возвращал управление с кодом 0, не прочитав ни одного байта).

В ранних версиях стандартный вывод фонового процесса просто шел на терминал, если не был перенаправлен. А в SVR4 фоновый процесс при попытке выдачи на терминал, если установлен бит TOSTOP в поле c_lflag (см. termios(2), ioctl(2), <termios.h>), получает сигнал SIGTTOU. Обычно, это вынуждает фоновый процесс приостановиться. Однако, если процесс игнорирует или задерживает SIGTTOU, выдача на терминал все-таки происходит.

Командный процессор bash(1) под SVR4 традиционно собирают с игнорированием SIGTTOU. Чтобы наблюдать остановку фоновых процессов при попытке вывода на экран, необходимо использовать стандартные командные оболочки SVR4, поддерживающие управление заданиями — ksh(1) или jsh(1).

 

Управление заданиями - Пример

Эта программа создаёт подпроцесс, который пишет числа на экран терминала. Родительский процесс позволяет порождённому писать в течение 5 секунд, останавливает его на 10 секунд, а затем перезапускает, позволяя ему исполняться в течение еще 10 секунд, пока не пошлёт ему SIGTERM.

Программа, исполняемая порожденным процессом:

   main()

   {

                  int i = 0;

                  while(1) {

                  printf("%d\n", i++);

                  sleep(1);

                  }

   }

 

Файл: job_cont.c

               УПРАВЛЕНИЕ ЗАДАНИЯМИ - ПРИМЕР

 

 1 #include <sys/types.h>

 2 #include <signal.h>

 3 #include <sys/procset.h>

 4

 5 main()

 6 {

 7      pid_t pid;

 8      if ((pid = fork()) == 0) {

 9          execl("./forever", "forever", 0);

10          fprintf("execl failed\n");

11          exit(1);

12      }

13      else {

14          sleep(5);

15          sigsend(P_PID, pid, SIGSTOP);

16          sleep(10);

17          sigsend(P_PID, pid, SIGCONT);

18          sleep(10);

19          sigsend(P_PID, pid, SIGTERM);

20          wait(0);

21      }

22 }

23

 


Дата добавления: 2018-06-27; просмотров: 217; Мы поможем в написании вашей работы!

Поделиться с друзьями:






Мы поможем в написании ваших работ!