有问题关于使用exitC++中.答案讨论主要是因为RAII不是好主意,例如,如果exit在代码中某处调用,则不会调用对象的析构函数,因此,如果例如析构函数是为了将数据写入文件,则不会发生这种情况,因为没有调用析构函数.
我感兴趣的是C中的这种情况.类似的问题是否也适用于C?我想在C中我们不使用构造函数/析构函数,C中的情况可能会有所不同.所以exit在C中使用是否可以?
我已经看到了下面的函数,我觉得在某些情况下可以使用它,但是如果我们在C中使用类似的问题感兴趣exit,如上面用C++所述?(这将使使用下面的功能不是一个好主意.).
void die(const char *message)
{
if(errno) {
perror(message);
} else {
printf("ERROR: %s\n", message);
}
exit(1);
}
Run Code Online (Sandbox Code Playgroud) 我知道两者之间的差异.一个值得注意的事情是abort()发送SIGABRT信号,因此当您的软件依赖它们时它可能是相关的.但是对于一个典型的应用程序exit()似乎是更安全的abort()版本......?使用abort()而不是exit()还有其他问题吗?
根据手册页 (2),该exit函数不是线程安全的: ,这是因为该函数尝试通过调用使用和MT-Unsafe race:exit注册的回调来清理资源(将数据刷新到磁盘、关闭文件描述符等...)。我希望我的程序能够做到这一点!(我的一个线程在整个程序的生命周期中保持文件描述符打开,所以这对我来说不是一个选择,因为我希望将所有数据写入输出文件)on_exitatexit_exit
我的问题如下:如果我很小心并且我不在线程之间共享任何敏感数据(如 fd),那么exit在多线程程序中调用是否“可接受”?请注意,我仅exit在发生不可恢复的错误时才调用。然而,当程序尝试退出时,我无法承受段错误。问题是,任何线程都可能发生不可恢复的错误......
我正在考虑使用 setjmp/longjmp “很好地”终止我的线程,但这会非常复杂,并且需要在我的代码中进行许多更改。
任何建议将不胜感激。谢谢 !:)
编辑:感谢@Ctx启发,我想出了以下想法:
#define EXIT(status) do { pthread_mutex_lock(&exit_mutex); exit(status); } while(0)
当然,exit_mutex 必须是全局的(外部)。
在atexit图书馆等大型项目中使用是否存在固有的危险?
如果是这样,那背后的技术性质atexit可能会导致大型项目出现问题?