如何重新启动在Windows下编写的控制台C应用程序?

3

我正在使用MSVS 2008。我正在编写一款c语言应用程序,想知道在Windows中重新启动应用程序的最佳方法是什么。

我查看了一些资料,有人正在尝试做这样的事情,但我不确定那是否是最好的方式,或者那是否创建了一个全新的进程。

    if(command == restart)
    {
        printf("program exiting!\n");
        Sleep(2000);
        system("cls");

        WinExec("my_app.exe", SW_SHOW);
        exit(0);
    }

谢谢


所以你只是想在命令窗口中一遍又一遍地运行程序,还是有什么我不知道的东西?每次都使用相同的命令窗口还是不同的窗口? - nategoose
实际上,该程序将通过HTTP与服务器通信。程序将从服务器接收命令,其中一个命令可能是“重新启动”命令。当它执行此操作时,它必须关闭并重新启动自身。最终可能不会有命令窗口,而只是像服务一样运行。重新启动的原因可能是应用程序有新版本。 - emge
1
不要忘记使用 argv[0] 来获取应用程序名称。你也可以使用 system(char*) 来调用该应用程序。 - mikek3332002
3个回答

1

对于这个,你需要额外开启一个进程。

从你的应用程序中,你将启动该进程。它将等待你的主应用程序退出,然后等待任何应该发生的事情(更新,...),然后重新启动并杀死自己。

从内部启动应用程序不可行,因为你将无法更新任何内容。


0

这里有一个关于如何启动计算器的愚蠢示例。

STARTUPINFO startUpInfo = { 0 };
PROCESS_INFORMATION procInfo = { 0 };

startUpInfo.cb = sizeof( startUpInfo );

无限循环:
{
CreateProcess( L"C:\windows\System32\calc.exe", NULL, NULL, NULL, FALSE, 0, NULL, NULL, &startUpInfo, &procInfo );

WaitForSingleObject( procInfo.hProcess, INFINITE );
}

正如你所看到的,这将启动一个名为“calc.exe”的新进程。它会等待进程终止,然后再次启动。请注意,我在此处没有关闭任何句柄!


0

简短回答:在我看来没问题,但如果你绑定到套接字,父进程退出之前两个程序可能会发生冲突。

我担心询问“最佳”方法会产生那种“它取决于上下文”的回复。

首先,根据MSDN文档中的说明,WinExec函数“仅提供与16位Windows兼容性。应用程序应使用CreateProcess函数”。这意味着它是一个类似于“exec”的函数的dos时代函数包装器。当然,CreateProcess是一种只有微软才会创建的怪物,但如果这个应用程序稍微重要一些,建议还是应该采纳这个建议。

有趣的是,MS在CreatProcess的文档中提到,“关闭进程的首选方法是使用ExitProcess函数。”

因此,就像许多问题一样,有很多解决方案。可能会锤炼这里的回复的问题是:

  • 您是否关心平台无关性?
  • 您是否关心安全性?
  • 您是否关心这个程序需要多少工作量?

等等。

我希望这可以帮助您!


谢谢回复。我想我只是在寻找其他的方法来做这件事。我以前只在Linux中使用fork()和exec(),从未在Windows中尝试过。回答你的问题,我不关心平台独立性,这将仅在Windows上运行。我关心安全性。至于需要多少努力,这是一个长期项目(几个月),但这只是整个项目的一小部分。 - emge

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接