Удаление информации о сбойных процессах из системных таблиц

Опубликовано в Технологии > Серверные технологии

Поскольку в параллельных серверах для динамического создания процессов используется функция fork, они являются потенциальным источником проблемы не полностью завершившихся процессов (процессов, информация о которых остается в системных таблицах). В системе Linux эта проблема решается путем передачи специального сигнала родительскому процессу после завершения работы каждого дочернего процесса. Завершившийся процесс остается в виде так называемого процесса-зомби до тех пор, пока родительским процессом не будет выполнен системный вызов wait3. Для полного завершения дочернего процесса (т.е. для уничтожения процесса-зомби) в рассматриваемом примере сервера ECHO перехватывается сигнал завершения дочернего процесса и выполняется функция обработки этого сигнала. Операционной системе дается указание, что для ведущего процесса сервера при получении каждого сигнала о завершении работы дочернего процесса (сигнал SIGCHLD) должна быть выполнена функция reaper, в виде следующего вызова:

signal(SIGCHLD, reaper); 

После вызова функции signal система автоматически вызывает функцию reaper при получении процессом сервера каждого сигнала SIGCHLD. услуги бухгалтера в москве

Функция reaper вызывает системную функцию wait3 для полного завершения дочернего процесса, закончившего свою работу. Функция wait3 остается заблокированной до тех пор, пока не произойдет завершение работы одного или нескольких дочерних процессов (по любой причине). Эта функция возвращает значение структуры status, которую можно проанализировать для получения дополнительной информации о завершившемся процессе. Поскольку данная программа вызывает функцию wait3 при получении сигнала SIGCHLD, вызов этой функции всегда происходит только после завершения работы дочернего процесса. Для предотвращения возникновения в сервере тупиковой ситуации в случае ошибочного вызова в программе используется параметр WN0HANG, который указывает, что функция wait3 не должна блокироваться в ожидании завершения какого-либо процесса. Вместо этого возврат управления после вызова происходит немедленно, даже если не произошел выход из какого-либо процесса.