我的程序中有一个注册的信号处理程序。 在收到不需要的信号(SIGABRT)时,我在信号处理程序中调用'exit(-1)'来退出这个过程。 但是正如在几个会话中所注意到的那样,它调用exit(),但是没有终止进程。
这个问题是随机产生的,我强烈怀疑执行exit()。
出现任何可能导致exit()无法终止进程的原因或情况。
谢谢。
你是从信号处理程序调用exit()
吗?
在man 7 signal
,节Async-signal-safe功能可以看到所有在信号处理程序中调用的功能。
信号处理函数必须非常小心,因为在其他地方的处理可能会在程序执行的某个任意点被中断。 POSIX有“安全功能”的概念。 如果一个信号中断了一个不安全的函数的执行,并且处理程序调用了一个不安全的函数,那么程序的行为是不确定的。
POSIX.1-2004(也称为POSIX.1-2001技术勘误2)要求实施,以确保在信号处理程序中可以安全地调用以下功能:
在那里你可以看到函数_Exit()
, _exit()
exit()
和abort()
,但是显然不是exit()
。 所以你不应该从信号处理程序中调用它。
令人讨厌的是,即使你从一个信号处理程序( printf()
any)中调用一个不安全的函数,它也只会在大多数情况下工作…但并不总是如此。
是的,有一些情况,比如:
exit()函数应首先调用由atexit()注册的所有函数,其注册顺序相反,除了在注册之前已经调用的任何先前注册的函数之后调用函数。 每个函数被调用多次,因为它被注册。 如果在调用任何这样的函数期间调用longjmp()函数来终止对已注册函数的调用,则行为是不确定的。
如果通过调用atexit()注册的函数不能返回,则不应该调用其余的注册函数,其余的exit()处理不应该完成。 如果不止一次调用exit(),则行为是未定义的。
请参阅退出时的POSIX页面。
有关更多信息,请在遇到问题时附加一个调试器,并查看调用堆栈。