Фоновые процессы на основе posix 


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



ЗНАЕТЕ ЛИ ВЫ?

Фоновые процессы на основе posix



В этом разделе ознакомимся с особенностями разработки фоновых процессов в UNIX-совместимых системах. У них фоновые процессы по традиции называют демонами (daemons). К стандартным демонам Linux принадлежат: init, что является предком всех процессов системы; сгоп, что обеспечивает запуск программ в определенные моменты времени; sendmail, что обеспечивает отсылку и получение электронной почты и тому подобное.

Сессии и группы процессов

Каждый процесс принадлежит к группе процессов, которую помечают идентификатором группы процессов (pgid). Ядро может выполнять определенные действия над всеми процессами группы (например, отсылать им всем сигнал). Каждая группа может иметь лидера группы (у этого процесса идентификатор (pid) совпадает с идентификатором группы). Обычно процесс наследует идентификатор группы от своего предка, он может также явно изменить свою группу системным вызовом setpgrp().

Все процессы группы владеют одним и тем самым управляющим терминалом в конкретный момент времени, во время выполнения он может изменяться. В группы такого терминала может и совсем не быть - в этом случае ее процессы не будут получать сигналов от клавиатуры.

Несколько групп процессов объединяют в сессию. Для сессии задают идентификатор сессии (sid). Обычно процессы сессии отвечают набору процессов, которые создал пользователь во время интерактивного сеанса работы с системой.

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

У каждой сессии есть лидер сессии, который отвечает за управление сессией и изоляцию ее от других; его идентификатор совпадает с идентификатором сессии. Если лидер сессии связан с терминалом, в случае выхода пользователя из системы этот процесс получает сигнал SIGHUP. Обычной реакцией на этот сигнал будет завершение работы процесса-лидера и всех процессов его сессии.

Когда лидер сессии с терминалом не связан, сигнала о выходе он не получит и сможет продлить выполнение по окончании сеанса работы. Это особенно важно для фоновых процессов.

Взаимосвязь между сессиями, группами процессов и управляющими терминалами показанная на рис. 8.3.

Рис.8.3 Сесии, группы процессов и управлдяющие терминалы

Создание новой сессии

Посмотрим, как пользователь может создать новую сессию и для чего это может понадобиться. Новую сессию создают с помощью системного вызова setsid(). Во время его выполнения

· создают сессию, и текущий процесс становится её лидером;

· создают новую группу процессов в рамках сессии, и текущий процесс становится ее лидером;

· для текущего процесса разрывают связь с управляющим терминалом, если он был.

В итоге будет создана сессия без управляющего терминала и с одной фоновой группой внутри нее, что содержит на этот момент один процесс. Этим как текущий процесс, так и свои потомки будут защищены от сигналов из клавиатуры и сигнала о выходе из системы, то есть будут корректно переведены в фоновый режим. Именно так необходимо реализовывать фоновые процессы, которые предусматривают использовать независимо от наличия интерактивных сеансов пользователей в системе.

Отметим, что, если процесс уже является лидером группы процессов, вызов setsid() приведет к ошибке. Для того, чтобы ее избежать, рекомендуют сначала создать потомка процесса с помощью fork () (он гарантированно не будет лидером группы), в нем вызывать setsid(), а предка завершить.



Поделиться:


Последнее изменение этой страницы: 2017-01-19; просмотров: 112; Нарушение авторского права страницы; Мы поможем в написании вашей работы!

infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 3.134.102.182 (0.004 с.)