Управление заданиями (job control) (1114937), страница 3
Текст из файла (страница 3)
Если и интерпретатор, и каждый из сыновних процессов вызовут setpgid, это гарантирует, что всё будетсделано правильно независимо от того, какой из процессов сделает это первым.Если задание запускается как основное задание, новая группа процессов должна бытьсделана основной группой процессов управляющего терминала с помощью вызова функцииtcsetpgrp. Точно так же, это действие должен сделать и сам интерпретатор, и каждый изего сыновних процессов.После этого каждый сыновний процесс должен восстановить обработку сигналов. Приинициализации процесс интерпретатора установил игнорирование сигналов управления заданиями. В результате каждый сыновний процесс унаследовал эту обработку сигналов. Длясыновних процессов это, без сомнения, нежелательно, поэтому каждый сыновний процессдолжен явно установить действия для этих сигналов в SIG_DFL.Наконец, каждый сыновний процесс должен вызвать exec и запустить требуемую программу.
В этом месте должны быть обработаны перенаправления дескрипторов ввода/вывода.7Если командный интерпретатор не запущен как интерактивный, все манипуляции с изменением группы процессов и переустановкой сигналов выполняться не должны.1.7.3 Переключение между основным и фоновым режимомКогда запускается основное задание, интерпретатор должен дать ему доступ к управляющему терминалу, вызвав tcsetpgrp. После этого он должен ждать пока все процессы восновной группе процессов не завершатся или не будут остановлены.После того, как все процессы в основной группе завершились или остановлены, интерпретатор должен снова взять терминал под контроль для своей собственной группы процессов, вызвав tcsetpgrp.Фоновое задание может оставить терминал в непонятном состоянии, поэтому интерпретатор должен восстановить свои сохранённые режимы терминала перед тем, как перейти квводу команд пользователя.
В случае, если задание было остановлено, интерпретатор должен перед этим сохранить текущие режимы терминала, чтобы восстановить их позднее, когда задание будет продолжено. Для сохранения и восстановления режимов терминала используются функции tcgetattr и tcsetattr.Если задание запускается в фоновом режиме, интерпретатор остается в основном режиме и продолжает ввод команд пользователя с терминала.1.7.4 Остановленные и завершившиеся заданияКогда основное задание запущено, интерпретатор должен дождаться, пока все процессызадания либо завершатся, либо будут остановлены.
Для этого интерпретатор может вызватьфункции waitpid или wait4. Чтобы получать информацию об остановленных процессахнужно указать опцию WUNTRACED.Кроме этого интерпретатор должен регулярно проверять статус фоновых заданий, чтобысообщать о завершившихся или остановленных заданиях пользователю. Для этого могут использоваться функции waitpid или wait4 с опцией WNOHANG. Такая проверка может бытьпомещена перед вводом новых команд пользователя.Интерпретатор может получать асинхронные сообщения о том, что доступен статус сыновних процессов, если он установит обработчик сигнала SIGCHLD.1.7.5 Продолжение остановленных заданийИнтерпретатор может продолжить остановленное задание, послав сигнал SIGCONT соответствующей группе процессов. Если задание продолжается как основное задание терминала, интерпретатор должен вызвать tcsetpgrp, чтобы дать заданию доступ к терминалу,и восстановить установки терминала. После того, как задание было продолжено в режимеосновного задания терминала, интерпретатор команд должен подождать, пока все процессы задания завершатся или будут остановлены, как будто бы это задание было только чтозапущено как основное.8.