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

Листинг 26.2. Вывод значения статуса, возвращенного wait() и другими похожими вызовами

procexec/print_wait_status.c

#define _GNU_SOURCE /* Получаем объявление strsignal() из */

#include

#include

#include "print_wait_status.h" /* Объявление printWaitStatus() */

#include "tlpi_hdr.h"

/* ВАЖНО: в следующей функции используется вызов printf(), который не является

безопасным с точки зрения асинхронных сигналов (см. подраздел 21.1.2). Это делает

всю функцию небезопасной для работы с асинхронными сигналами (то есть будьте

осторожны, когда вызываете ее из обработчика SIGCHLD). */


void /* Анализируем статус wait() с помощью макросов W* */

printWaitStatus(const char *msg, int status)

{

if (msg!= NULL)

printf("%s", msg);


if (WIFEXITED(status)) {

printf("child exited, status=%d\n", WEXITSTATUS(status));


} else if (WIFSIGNALED(status)) {

printf("child killed by signal %d (%s)",

WTERMSIG(status), strsignal(WTERMSIG(status)));

#ifdef WCOREDUMP /* Не входит в стандарт SUSv3, может отсутствовать

в некоторых системах */

if (WCOREDUMP(status))

printf(" (core dumped)");

#endif

printf("\n");

} else if (WIFSTOPPED(status)) {

printf("child stopped by signal %d (%s)\n",

WSTOPSIG(status), strsignal(WSTOPSIG(status)));


#ifdef WIFCONTINUED /* Входит в стандарт SUSv3, но может отсутствовать

в ранних версиях Linux и некоторых реализациях UNIX */

} else if (WIFCONTINUED(status)) {

printf("child continued\n");

#endif


} else { /* Этого никогда не должно случиться */

printf("what happened to this child? (status=%x)\n",

(unsigned int) status);

}

}

procexec/print_wait_status.c

В листинге 26.3 применяется функция printWaitStatus(). Она создает дочерний процесс, который либо входит в цикл, постоянно вызывая pause() (в этот момент потомку можно слать сигналы), либо, если был предоставлен целочисленный аргумент командной строки, сразу же завершается, используя этот аргумент в качестве кода завершения. Тем временем родитель следит за потомком с помощью вызова waitpid(), выводит возвращенный код и передает его в функцию printWaitStatus(). Родитель завершает работу, обнаружив, что потомок уже остановлен — либо штатно, либо с помощью сигнала.

Следующая сессия командной оболочки демонстрирует несколько запусков программы из листинга 26.3. Для начала создадим дочерний процесс, который сразу же завершается с кодом 23:

$ ./child_status 23

Child started with PID = 15807

waitpid() returned: PID=15807; status=0x1700 (23,0)

child exited, status=23

Теперь запустим программу в фоновом режиме и отправим дочернему процессу сигналы SIGSTOP и SIGCONT:

$ ./child_status &

[1] 15870

$ Child started with PID = 15871

kill — STOP 15871

$ waitpid() returned: PID=15871; status=0x137f (19,127)

child stopped by signal 19 (Stopped (signal))

kill — CONT 15871

$ waitpid() returned: PID=15871; status=0xffff (255,255)

child continued

Последние две строчки вывода появляются только в Linux версии 2.6.10 и выше, поскольку более старые ядра не поддерживают параметр WCONTINUED для waitpid() (сессия командной оболочки получается немного хаотичной, поскольку программа выполняется в фоновом режиме и ее вывод может смешиваться с приглашением командной строки).

Продолжаем сессию командной оболочки. Отправим сигнал SIGABRT, чтобы завершить работу потомка:

kill — ABRT 15871

$ waitpid() returned: PID=15871; status=0x0006 (0,6)

child killed by signal 6 (Aborted)

Нажмите Enter, чтобы увидеть уведомление командной оболочки о завершении фоновой задачи

[1]+ Done./child_status

$ ls — l core

ls: core: No such file or directory

$ ulimit — c Выводим ограничение RLIMIT_CORE

0

И хотя по умолчанию сигнал SIGABRT генерирует дамп памяти перед завершением процесса, в данном случае этого не произошло. Дело в том, что дамп памяти был отключен; согласно команде ulimit, приведенной выше, ограничение на программные ресурсы RLIMIT_CORE (см. раздел 36.3), которое задает максимальный размер файла с дампом памяти, было установлено в 0.

Повторим тот же эксперимент, но на этот раз перед отправкой потомку сигнала SIGABRT включим дамп памяти:

$ ulimit — c unlimited Включаем дампы памяти

$ ./child_status &

[1] 15902

$ Child started with PID = 15903

kill — ABRT 15903 Передаем потомку сигнал SIGABRT

$ waitpid() returned: PID=15903; status=0x0086 (0,134)

child killed by signal 6 (Aborted) (core dumped)

Нажмите Enter, чтобы увидеть уведомление командной оболочки о завершении фоновой задачи

[1]+ Done./child_status

$ ls — l core На этот раз мы получаем дамп памяти

— rw- 1 mtk users 65536 May 6 21:01 core


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

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

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#.Введите сюда краткую аннотацию

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

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