Сигналы для управления заданиями
В ОС 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; Мы поможем в написании вашей работы! |
Мы поможем в написании ваших работ!