Читаем Linux API. Исчерпывающее руководство полностью

Стандарт SUSv3 также позволяет отправлять родителю сигнал SIGCHLD, если один из его остановленных потомков возобновил работу (получив сигнал SIGCONT) — по аналогии с тем, как действует флаг WCONTINUED в вызове waitpid(). Эта возможность доступна в ядре Linux, начиная с версии 2.6.9.


26.3.3. Игнорирование завершенных дочерних процессов

Существует еще один способ работы с завершенными процессами. Явное изменение диспозиции сигнала SIGCHLD на SIG_IGN приводит к тому, что любой потомок, который впоследствии завершает работу, немедленно удаляется из системы, вместо того чтобы превратиться в «зомби». В этом случае последующий вызов wait() (или аналогичный) не может вернуть никаких сведений о завершенном дочернем процессе, поскольку его статус просто сбрасывается.

Стоит отметить, что, хотя диспозицией сигнала SIGCHLD по умолчанию является игнорирование, явная установка диспозиции SIG_IGN приводит к описанному выше поведению, отличному от поведения по умолчанию. SIGCHLD — единственный сигнал, который ведет себя таким образом.

В Linux, как и во многих реализациях UNIX, изменение диспозиции сигнала SIGCHLD на SIG_IGN не влияет на статус уже имеющихся потомков-«зомби», которых по-прежнему нужно ждать. Хотя в некоторых версиях UNIX (таких как Solaris 8) это приводит к удалению существующих дочерних процессов-«зомби».

Семантика SIG_IGN для сигнала SIGCHLD имеет длинную историю, берущую свое начало в System V. Поведение, описанное выше, предусмотрено стандартом SUSv3, однако данная семантика не является частью оригинального стандарта POSIX.1. Таким образом, игнорирование сигнала SIGCHLD в некоторых реализациях UNIX никак не влияет на создание процессов-«зомби». Единственный полностью переносимый способ предотвратить появление зомби заключается в использовании вызовов wait() или waitpid(), возможно даже внутри обработчика, установленного для SIGCHLD.


Флаг SA_NOCLDWAIT при вызове sigaction()

В стандарте SUSv3 описан флаг SA_NOCLDWAIT вызова sigaction(), с помощью которого можно изменять действие сигнала SIGCHLD. Этот флаг обеспечивает поведение, похожее на то, к которому приводит изменение действия SIGCHLD на SIG_IGN. Он был реализован в Linux 2.6.

Использование флага SA_NOCLDWAIT принципиально отличается от изменения действия SIGCHLD на SIG_IGN тем, что стандарт SUSv3 умалчивает, должен ли сигнал SIGCHLD передаваться родителю при завершении потомка. Иными словами, в отдельной реализации, если указан флаг SA_NOCLDWAIT, сигнал SIGCHLD может доставляться, и приложение может его перехватить (хотя обработчик не сможет получить статус потомка с помощью вызова wait(), поскольку ядро успевает уничтожить процесс-«зомби»). В некоторых реализациях UNIX, в том числе и в Linux, ядро действительно генерирует сигнал SIGCHLD для родителя. Но есть системы, в которых этого не происходит.


26.4. Резюме


Использование вызовов wait() и waitpid() (и других связанных с ними функций) позволяет родительскому процессу получать статус его завершенных и остановленных потомков. Этот статус сигнализирует, завершился ли дочерний процесс в штатном режиме (успешно или нет), завершился ли аварийно, был ли он остановлен или возобновлен по сигналу (во втором случае это сигнал SIGCONT).

Если родитель завершает свою работу, его потомки становятся «сиротами» и «удочеряются» процессом init, чей идентификатор равен 1.

Когда завершается дочерний процесс, он становится «зомби» и удаляется из системы только после того, как его родитель получит его статус с помощью вызова wait() (или аналогичного). Долгоживущие программы, такие как командные оболочки и демоны, нужно проектировать так, чтобы они всегда могли получить статус созданного ими потомка, поскольку процессы в состоянии «зомби» не могут быть завершены, и в какой-то момент они переполнят таблицу процессов ядра.

Стандартный способ снятия завершенных дочерних процессов заключается в установлении обработчика для сигнала SIGCHLD. Этот сигнал доставляется родителю всякий раз, когда один из его потомков завершает работу, и, опционально, когда потомок останавливается по сигналу. Есть и другой, менее переносимый вариант: процесс может изменить диспозицию сигнала SIGCHLD на SIG_IGN, в результате чего статус завершенных потомков сразу же сбрасывается (и больше не может быть получен родителем) и они не становятся «зомби».


Дополнительная информация

Ознакомьтесь с источниками, приведенными в разделе 24.6.


26.5. Упражнения


26.1. Напишите программу, в которой проверяется утверждение, что при завершении родительского процесса вызов getppid() в его потомках возвращал 1 (идентификатор процесса init).

Перейти на страницу:

Похожие книги

C++ Primer Plus
C++ Primer Plus

C++ Primer Plus is a carefully crafted, complete tutorial on one of the most significant and widely used programming languages today. An accessible and easy-to-use self-study guide, this book is appropriate for both serious students of programming as well as developers already proficient in other languages.The sixth edition of C++ Primer Plus has been updated and expanded to cover the latest developments in C++, including a detailed look at the new C++11 standard.Author and educator Stephen Prata has created an introduction to C++ that is instructive, clear, and insightful. Fundamental programming concepts are explained along with details of the C++ language. Many short, practical examples illustrate just one or two concepts at a time, encouraging readers to master new topics by immediately putting them to use.Review questions and programming exercises at the end of each chapter help readers zero in on the most critical information and digest the most difficult concepts.In C++ Primer Plus, you'll find depth, breadth, and a variety of teaching techniques and tools to enhance your learning:• A new detailed chapter on the changes and additional capabilities introduced in the C++11 standard• Complete, integrated discussion of both basic C language and additional C++ features• Clear guidance about when and why to use a feature• Hands-on learning with concise and simple examples that develop your understanding a concept or two at a time• Hundreds of practical sample programs• Review questions and programming exercises at the end of each chapter to test your understanding• Coverage of generic C++ gives you the greatest possible flexibility• Teaches the ISO standard, including discussions of templates, the Standard Template Library, the string class, exceptions, RTTI, and namespaces

Стивен Прата

Программирование, программы, базы данных
1С: Бухгалтерия 8 с нуля
1С: Бухгалтерия 8 с нуля

Книга содержит полное описание приемов и методов работы с программой 1С:Бухгалтерия 8. Рассматривается автоматизация всех основных участков бухгалтерии: учет наличных и безналичных денежных средств, основных средств и НМА, прихода и расхода товарно-материальных ценностей, зарплаты, производства. Описано, как вводить исходные данные, заполнять справочники и каталоги, работать с первичными документами, проводить их по учету, формировать разнообразные отчеты, выводить данные на печать, настраивать программу и использовать ее сервисные функции. Каждый урок содержит подробное описание рассматриваемой темы с детальным разбором и иллюстрированием всех этапов.Для широкого круга пользователей.

Алексей Анатольевич Гладкий

Программирование, программы, базы данных / Программное обеспечение / Бухучет и аудит / Финансы и бизнес / Книги по IT / Словари и Энциклопедии
C# 4.0: полное руководство
C# 4.0: полное руководство

В этом полном руководстве по C# 4.0 - языку программирования, разработанному специально для среды .NET, - детально рассмотрены все основные средства языка: типы данных, операторы, управляющие операторы, классы, интерфейсы, методы, делегаты, индексаторы, события, указатели, обобщения, коллекции, основные библиотеки классов, средства многопоточного программирования и директивы препроцессора. Подробно описаны новые возможности C#, в том числе PLINQ, библиотека TPL, динамический тип данных, а также именованные и необязательные аргументы. Это справочное пособие снабжено массой полезных советов авторитетного автора и сотнями примеров программ с комментариями, благодаря которым они становятся понятными любому читателю независимо от уровня его подготовки. Книга рассчитана на широкий круг читателей, интересующихся программированием на C#.Введите сюда краткую аннотацию

Герберт Шилдт

Программирование, программы, базы данных