zabika.ru   1 2 3 ... 7 8

Передний план и фоновый режим.

Задания могут выполняться или на переднем плане (англ. foreground), или в фоновом режиме (англ. background). На переднем плане в любой момент времени может быть только одно задание. Задание на переднем плане взаимодействует с пользователем, получает ввод с клавиатуры терминала и посылает вывод на экран. Задания в фоновом режиме не получают ввода с терминала и обычно ничего на него не выводят (в противном случае выводящиеся из них данные будут произвольным образом смешиваться с выводом из команды переднего плана). Как правило, это задания, которые не нуждаются во взаимодействии с пользователем.

Некоторые задания исполняются очень долго, и во время их работы не происходит ничего интересного. Пример таких заданий — компилирование программ, а также сжатие больших файлов. Нет никаких причин смотреть на экран и ждать, когда эти задания выполнятся. Такие задания вполне можно запускать в фоновом режиме, тогда во время их выполнения Вы сможете работать с другими программами.

Для управления выполнением процессов в Linux предусмотрен механизм передачи сигналов. Сигнал — это способность процессов обмениваться стандартными короткими сообщениями непосредственно с помощью операционной системы. Сообщение-сигнал не содержит никакой информации, кроме номера сигнала (для удобства вместо номера можно использовать предопределённое системой имя). Для того, чтобы передать сигнал, процессу достаточно задействовать системный вызов kill(), а для того, чтобы принять сигнал, не нужно ничего. Если процессу нужно как-то по-особенному реагировать на сигнал, он может зарегистрировать обработчик,

а если обработчика нет, вместо него на сигнал отреагирует система. Как правило, это приводит к немедленному завершению получившего сигнал процесса. Обработчик сигнала запускается асинхронно, немедленно после получения сигнала, что бы процесс в это время ни делал.

Два сигнала — номер 9 (KILL) и 19 (STOP) — всегда обрабатывает система. Первый из них принудительно останавливает и уничтожает процесс (отсюда и название, англ. kill — убивать). Сигнал STOP приостанавливает процесс: в таком состоянии процесс не удаляется из таблицы процессов, но и не выполняется до тех пор, пока не получит сигнал 18 (CONT), после чего продолжает работу. В командной оболочке Linux сигнал STOP можно передать активному процессу с помощью управляющей последовательности <Ctrl>+<Z>.

Сигнал номер 15 (TERM) служит для прерывания работы задания. При прерывании (англ.
interrupt) задания процесс завершает свою работу. Прерывание заданий обычно осуществляется управляющей последовательностью <Ctrl>+<C>. Восстановить прерванное задание никаким образом невозможно. В отличии от сигнала KILL, программы могут перехватить сигнал TERM и установить собственный обработчик этого сигнала,так что нажатие комбинации клавиш <Ctrl>+<C> может не прервать процесс немедленно. Это сделано для того, чтобы программа могла корректно завершить свою работу — удалить временные файлы, закончить запись данных и т. п., прежде, чем она будет завершена. На практике, некоторые программы вообще нельзя прервать таким способом.


Существует утилита kill, предназначенная для отправления того или иного сигнала произвольному процессу. Её формат вызова:

kill [-s SIGNAL | -SIGNAL] PID

где SIGNAL — это посылаемый процессу сигнал, а PID — соответствующий идентификатор процесса. Например, для посылки сигнала KILL процессу 1 можно записать:

$ kill -SIGKILL 1 -bash: kill: (1) - Операция не позволена

Данная команда, разумеется, закончилась с ошибкой — на отправление сигналов также распространяются соглашения о контроле доступа,
и обычному пользователю не разрешено отправлять какие-либо сигналы (тем более
KILL) процессам, выполняющимся с правами суперпользователя (как говорилось в предыдущей лабораторной работе, процесс с PID
, равным 1 — это init).



<< предыдущая страница   следующая страница >>