2017-06-14 47 views
1

我有一个析构函数,即使程序不正确地终止以确保外部进程死亡,也需要调用析构函数。退出或程序结束时执行函数

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

std::atexit(killprocess); 
std::at_quick_exit(killprocess); 

然而,这意味着该方案已完成,但没有终止时,进程没有中止。有什么方法可以确保killprocess或析构函数在退出或程序完成但未终止时调用?

编辑:完成但未终止的状态来自visual studio,在最后添加了等待条件。我相信这意味着注册kill process与atexit进程析构函数并不是在执行时自然被调用

+2

“完成但未终止”是什么意思?你的意思是'main'返回和过程实际结束之间的时间? –

+0

调用killprocess作为主要的最后一行 –

+0

如果我理解问题正确[std :: at_exit](http://en.cppreference.com/w/cpp/utility/program/atexit)实际上正在做你想做的事情: '注册func指向的函数,在正常程序终止时(通过std :: exit()或从主函数返回)调用''。 –

回答

1

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

1

应该在正常进程结束时调用由std :: atexit注册的退出处理程序。如果情况并非如此,那么你必须寻找其他地方。 请参阅std::atexit的文档。也许你也想设置std::set_terminate处理程序。 某些程序结尾无法处理,所以如果你想确定,你必须求助于某种外部监控。评论中几乎没有想法。

相关问题