Почему сигнал SIGABRT игнорируется в дочернем процессе - PullRequest
1 голос
/ 23 августа 2011

У нас есть сервисный процесс Linux, который порождает дочерний процесс с использованием fork, а затем запускает execelp для выполнения другой программы. Когда мы запускаем команду «kill -6 [child_pid]», это не имеет никакого эффекта. Эта же команда убьет дочернюю программу, если она будет запущена сама по себе, поэтому мы почти уверены, что сигнал обрабатывается системой в этом случае. Так почему же он не принимается дочерним процессом, когда он находится под контролем сервисного процесса? Любая помощь будет принята с благодарностью.

И это происходит в RedHat Linux и CentOS.

И размер файла ядра установлен неограниченным.

Также я хотел бы отметить, что та же команда работает с родительским процессом, поэтому мы знаем, что родительский объект не обрабатывает (игнорирует) SIGABRT. Родитель запускается сценарием оболочки (bash). Итак, при запуске команды "ps" я вижу pid сценария оболочки, родительский pid и дочерний pid. команда работает с родительским pid и сценарием оболочки pid.

И, насколько я понимаю, дочерний процесс наследует обработчики сигналов, а после execlp дочерняя программа - нет.

Ответы [ 2 ]

1 голос
/ 23 августа 2011

Цитирование с man sigaction:

Дочерний элемент, созданный с помощью fork (2), наследует копию сигнальных расположений своего родителя.Во время execve (2) расположение обработанных сигналов сбрасывается до значения по умолчанию;расположение игнорируемых сигналов остается неизменным.

Так что я предполагаю, что сервисный процесс настроен на игнорирование SIGABRT, и это наследуется дочерним элементом.

0 голосов
/ 23 августа 2011

Дочерний процесс наследует свою маску сигналов от родителя во время fork.

Так что я бы предположил, что ваш родительский процесс блокирует SIGABRT (через sigprocmask или pthread_sigmask ).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...