当前位置: 技术问答>linux和unix
如何实现程序的自动重启
来源: 互联网 发布时间:2017-01-15
本文导语: 程序出错后 需要重新从main函数处开始运行 使用goto语句不在同一函数中 不可行 调用main函数占着以前的资源不放 那怎么能让程序发现自己错误后 自己关闭后 让他 自己开始再运行起来 谢谢了 ...
程序出错后 需要重新从main函数处开始运行 使用goto语句不在同一函数中 不可行 调用main函数占着以前的资源不放
那怎么能让程序发现自己错误后 自己关闭后 让他 自己开始再运行起来 谢谢了
那怎么能让程序发现自己错误后 自己关闭后 让他 自己开始再运行起来 谢谢了
|
你可以建立一个父进程,它负责启动你的进程,并且在发现子进程失败后,重启子进程。
|
或者写一个脚本放在后台,定时监控进程。
|
二楼的说法靠谱,main函数里做的事情放到子进程里,main里就放一个管理子进程的父进程。
|
Win下是这样实现的。
思想为:
不需要另外创建一个程序,只需创建一个自己的“副本”进程即可。
1。接收参数改变,将新参数保存;
2。用CreateProcess创建一个自己的“克隆”进程——即新的“Instance”;
3。结束自己。
4。与此同时,“克隆”进程读取刚才保存的新参数,并且以新的参数开始运行。
void CChatClientDlg::RestartApp()
{
PROCESS_INFORMATION info;
STARTUPINFO startup;
char szPath[128];
char *szCmdLine;
GetModuleFileName(AfxGetApp()->m_hInstance, szPath, sizeof(szPath));
szCmdLine=GetCommandLine();
GetStartupInfo(&startup);
BOOL bSucc=CreateProcess(szPath, szCmdLine, NULL, NULL,
FALSE, NORMAL_PRIORITY_CLASS, NULL, NULL, &startup, &info);
if(bSucc)
{
CWnd *pWnd=AfxGetMainWnd();
if(pWnd!=NULL)
{
pWnd->PostMessage(WM_CLOSE, 0, 0);//会调用OnCancel
}
else
ExitProcess(-1);
}
else
ExitProcess(-1);
}
思想为:
不需要另外创建一个程序,只需创建一个自己的“副本”进程即可。
1。接收参数改变,将新参数保存;
2。用CreateProcess创建一个自己的“克隆”进程——即新的“Instance”;
3。结束自己。
4。与此同时,“克隆”进程读取刚才保存的新参数,并且以新的参数开始运行。
void CChatClientDlg::RestartApp()
{
PROCESS_INFORMATION info;
STARTUPINFO startup;
char szPath[128];
char *szCmdLine;
GetModuleFileName(AfxGetApp()->m_hInstance, szPath, sizeof(szPath));
szCmdLine=GetCommandLine();
GetStartupInfo(&startup);
BOOL bSucc=CreateProcess(szPath, szCmdLine, NULL, NULL,
FALSE, NORMAL_PRIORITY_CLASS, NULL, NULL, &startup, &info);
if(bSucc)
{
CWnd *pWnd=AfxGetMainWnd();
if(pWnd!=NULL)
{
pWnd->PostMessage(WM_CLOSE, 0, 0);//会调用OnCancel
}
else
ExitProcess(-1);
}
else
ExitProcess(-1);
}