可以退出()无法终止进程?

我的程序中有一个注册的信号处理程序。 在收到不需要的信号(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页面。

有关更多信息,请在遇到问题时附加一个调试器,并查看调用堆栈。