【发布时间】:2011-09-08 16:54:53
【问题描述】:
我想编写一个守护进程管理器来确保所有守护进程都在运行,就像这样(简化的伪代码):
void watchMe(filename)
{
while (true)
{
system(filename); //freezes as long as filename runs
//oh, filename must be crashed. Nevermind, will be restarted
}
}
int main()
{
_beginThread(watchMe, "foo.exe");
_beginThread(watchMe, "bar.exe");
}
这部分已经在工作 - 但现在我面临的问题是,当观察到的应用程序 - 比如 foo.exe - 崩溃时,相应的系统调用会冻结,直到我确认这个漂亮的消息框:
这使得守护进程无用。
我认为可能的解决方案是使观察到的程序(我控制)的 main() “不可崩溃”,以便它们优雅地关闭而不显示这个丑陋的消息框。
像这样:
try
{
char *p = NULL;
*p = 123; //nice null pointer exception
}
catch (...)
{
cout << "Caught Exception. Terminating gracefully" << endl;
return 0;
}
但这不起作用,因为它仍然会产生此错误消息:
("未处理的异常...写访问冲突...")
我已经尝试过 SetUnhandledExceptionFilter 和所有其他东西,但没有效果。
任何帮助将不胜感激。
问候
【问题讨论】:
-
空指针取消引用不会显式导致异常。
-
这正是我的 VS2005 设置所发生的事情。但无论如何,这只是导致应用程序崩溃的代码示例。
-
@David:如果您想要一个异常示例,只需抛出一个。 :)
throw 666; -
如果我这样做,我可以捕获异常。我的问题是,即使我将代码包装在 try/catch 中,我对应用程序崩溃也无能为力。
-
该程序依赖于一些我无法保证的库。此外,程序必须“永远”运行,你永远不会知道 - 所以我最好小心。