Может ли exit () не завершить процесс?

У меня есть зарегистрированный обработчик сигнала в моей программе. После получения нежелательного сигнала (SIGABRT) я вызываю "exit(-1)" в обработчике сигналов для выхода из процесса. Но, как было замечено на нескольких ocassions, он вызывает exit (), но не завершает процесс.

проблема была сгенерирована случайным образом, и я сильно подозреваю о выполнении exit().

могут ли быть какие-либо причины или случаи, в которых exit() может не завершить процесс.

спасибо.

2 ответов


ты называешь exit() из обработчика сигнала?

на man 7 signal, раздел Async-сигнал-безопасные функции вы можете просмотреть все функции, которые гарантированно работают при вызове из обработчика сигнала:

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

POSIX.1-2004 (также известный как POSIX.1-2001 техническое исправление 2) требует осуществления гарантируйте, что следующие функции могут быть безопасно вызваны внутри обработчика сигнала:

здесь вы можете увидеть функции _Exit(), _exit() и abort(), но не exit(). Так что не стоит его называть от обработчика сигналов.

неприятно то, что даже если вы вызываете небезопасную функцию из обработчика сигнала (printf() любой? это будет работать большую часть времени... но не всегда.


Да, есть некоторые обстоятельства, такие как:

функция exit () сначала вызывает все функции, зарегистрированные atexit (), в обратном порядке их регистрации, за исключением того, что функция вызывается после любых ранее зарегистрированных функций, которые уже были вызваны в момент ее регистрации. Каждая функция вызывается столько раз, сколько она была зарегистрирована. Если во время вызова любой такой функции выполняется вызов функции longjmp() , то завершите вызов зарегистрированной функции, поведение не определено.

Если функция, зарегистрированная вызовом atexit (), не возвращается, остальные зарегистрированные функции не вызываются, а остальная обработка exit () не завершается. Если exit() вызывается более одного раза, поведение не определено.

см. страницу POSIX на выход.

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