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

问题描述:

我在程序中注册了一个信号处理程序。在收到不需要的信号(SIGABRT)后,我在信号处理程序中调用'exit(-1)'来退出该过程。但正如少数会议上注意到的那样,它调用exit(),但未能终止进程。可以退出()无法终止进程?

该问题是随机生成的,我强烈怀疑执行exit()。

是否有任何原因或情况可导致exit()无法终止进程。

谢谢。

+1

我当然建议你寻找另一个导致bug的原因,而不是像'exit'这样的函数。几乎总是,当您认为编译器或标准库等存在错误时,导致错误是您自己的错误。 – Shahbaz 2012-01-12 10:24:27

+3

@Shahbaz:Mandar并不是在询问执行过程中的错误,或者暗示存在错误。问题是'exit'是否被指定为总是终止程序,答案是否定的(特别是如果从信号处理程序中调用)。 – 2012-01-12 11:10:49

+0

为什么不把SIGABRT的处理程序设置为exit()?无论您在信号处理程序中做了什么其他事情,都可以在atexit()调用中执行。 – 2012-01-12 17:24:29

你是否从信号处理程序调用exit()

man 7 signal,部分异步信号安全功能你可以看到所有被保障的功能从信号处理函数调用时的工作:

的信号处理函数必须非常小心,因为处理其他地方可能会中断 程序执行中的某些任意点。 POSIX具有“安全功能”的概念。如果 信号中断不安全函数的执行,并且处理程序调用不安全函数,那么程序的行为是未定义的。

POSIX.1-2004(又称POSIX.1-2001技术勘误2)要求 保证实现下面的功能可以被安全地调用一个讯号处理器中:

那里你可以见功能_Exit(),_exit()abort(),但特别不是exit()。所以你不应该从信号处理程序调用它。

令人讨厌的是,即使您从信号处理程序(printf()任何?)调用不安全的函数,它也会在大多数情况下工作......但并非总是如此。

+1

从信号处理程序调用异步信号不安全函数*完全合法*除非信号中断另一个异步信号不安全函数。这就解释了它“大部分时间”工作的原因,但这也意味着如果您注意确保信号处理程序不能中断不安全的情况,则即使在正确的,健壮的代码中,也可以在信号处理程序中使用异步信号不安全的函数函数(例如,在大部分时间保留信号并且在执行纯算术或像文件描述符IO和'select'这样的异步信号安全库调用时解除阻塞信号)。 – 2012-01-12 13:41:44

+0

@R ..当然你是对的。但在实践中很难确保,除非在特殊情况下。我个人觉得更方便,只是为了避免不安全的功能。 – rodrigo 2012-01-12 13:47:48

+1

另请参阅:http://pubs.opengroup.org/onlinepubs/009695399/functions/xsh_chap02_04.html – 2012-01-12 17:22:06

是的,有一些情况下,如:

出口()函数首先请)由atexit对(注册的所有功能,在其注册的相反的顺序,不同之处在于一个函数被调用在任何之前已经注册过的已经被调用的函数之后。每个功能在注册时都被调用多次。如果在调用任何此类函数期间调用longjmp()函数来终止对已注册函数的调用,则行为未定义。

如果通过对atexit()的调用注册的函数未能返回,则不应调用其余的注册函数,并且不应完成其余的exit()处理。如果不止一次调用exit(),则行为是未定义的。

请参阅exit上的POSIX页面。

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