C++ 在退出或程序结束时执行函数

C++ 在退出或程序结束时执行函数,c++,c++14,destructor,atexit,C++,C++14,Destructor,Atexit,我有一个析构函数,即使程序被不正确地终止,也需要调用它,以确保外部进程死亡 目前我已经注册了要调用的析构函数 std::atexit(killprocess); std::at_quick_exit(killprocess); 然而,这意味着当程序完成但未终止时,进程不会终止。有没有办法确保killprocess或析构函数在退出时调用,或者在程序完成但未终止时调用 编辑:完成但未终止的状态来自VisualStudio,它在末尾添加了一个等待条件。我认为这意味着在atexit中注册killpro

我有一个析构函数,即使程序被不正确地终止,也需要调用它,以确保外部进程死亡

目前我已经注册了要调用的析构函数

std::atexit(killprocess);
std::at_quick_exit(killprocess);
然而,这意味着当程序完成但未终止时,进程不会终止。有没有办法确保killprocess或析构函数在退出时调用,或者在程序完成但未终止时调用


编辑:完成但未终止的状态来自VisualStudio,它在末尾添加了一个等待条件。我认为这意味着在atexit中注册killprocess后,进程析构函数在执行过程中的这一点上不会自然调用

我认为您问的问题是错误的。您的目标实际上是找到一种方法,确保在父进程死亡时外部进程也会死亡。但仅仅依靠父进程中的某些函数调用无法确保这一点。父进程总是有可能陷入不一致的状态,或者不可避免地无法调用此清理函数。所以还有其他一些机制来实现期望的行为,比如在子进程中处理某些类型的keepalive。例如,您可以从父进程提供管道,因此当它因任何原因终止时,系统将自动关闭父进程管道端,子进程可以确定它需要退出。

在正常进程端调用std::atexit注册的退出处理程序。如果不是这样的话,那么你必须去别处看看。 有关详细信息,请参阅文档。也许你也需要设置处理程序。
有些程序的结尾无法处理,所以如果你想确定,你必须求助于某种外部监控。评论中已经没有什么想法了。

你说的“完成但未终止”是什么意思?您的意思是
main
返回到进程实际结束之间的时间吗?在main POSIX系统(如Linux和macOS)上调用killprocess作为最后一行,您可以捕获异常终止中使用的某些进程。然而,一些“异常终止”可能是崩溃,这是因为您想用
killprocess
清理这些东西,这可能反过来意味着
killprocess
可能无法工作。如果你撞车了,就让它发生吧。捕获
SIGQUIT
SIGTERM
SIGINT
SIGHUP
信号,并调用
exit
,这将调用已安装的退出处理程序。您是指Visual Studio在已终止的控制台应用程序窗口中放入的“按任意键…”文本吗?那么你的程序已经被终止,不再运行了。如果程序正常退出,那么全局和静态对象的退出处理程序和析构函数将已经运行。程序终止和Visual Studio等待您按键之间的这种状态都由Visual Studio处理。您的析构函数是什么?调用exit()告诉内核(UNIX、Linux或Windows)取消分配所有进程内存。没有什么需要清理的,它将停止退出。例如,当您必须在崩溃时删除文件,然后编写另一个进程来启动您的应用程序,保护它,并在崩溃时执行特殊操作(异常程序退出)。