2012-03-22 45 views
9

假设我有这两个事实的权利: -如何启动一个程序,使其“独立”

CreateProcess()启动一个过程,让你的程序,同时继续运行,但是当你的程序结束,孩子过程随之而来。此外,程序必须注意子进程何时退出,以便它可以正确释放进程句柄。

system()启动一个进程,等待它完成然后继续您的程序。

  • 我需要知道的是如何启动一个进程并让它独立于我的程序运行,并在我的程序退出后保留。我不需要捕获它的输出或对它进行任何进一步的控制,我只想让用户与它交互 - 就像我想写一个替代开始菜单运行命令一样。

那么,请问,实际上可以这样做吗?

+4

您是否尝试过使用'DETACHED_PROCESS'或'CREATE_NEW_PROCESS_GROUP' [进程创建标志](http://msdn.microsoft.com/zh-cn/library/windows/desktop/ms684863%28v=vs.85%29 .aspx)到'CreateProcess'? – 2012-03-22 08:47:27

+4

你的假设是不正确的。 – 2012-03-22 09:21:42

+0

quick hack:'system(“start yourprocess.exe”)' – smerlin 2012-03-22 09:48:50

回答

6

CreateProcess()不等待子进程默认完成,它立即返回。如果您想等待,请使用WaitForSingleObject。 不,当父进程存在时,子进程不会自动终止,并且无论如何由操作系统自动释放该句柄,而不需要自己执行(如果使用现代版本的Windows)。

就像任何操作系统资源(gdi对象,用户对象,内核对象)一样,如果你自己不销毁/释放/关闭资源,那么当你的应用程序运行时你将会有资源泄漏。您应该在CreateProcess返回后立即关闭从CreateProcess返回的两个句柄。

+0

你确定子进程没有在父进程退出时自动终止?我完全观察到这种行为,这引起了我的这个问题。 – user4815162342 2016-12-21 20:06:37

+0

我观察一样。除非您在创建标志中指定DETACHED_PROCESS,否则父级实际上会取消该子项。 – 2017-04-15 20:41:51

4

可以在CreationFlags如下面的代码snippent指定 “DETACHED_PROCESS”:

if (CreateProcessW(NULL, (LPWSTR) L"File.exe ", 
     0, 0, false,CREATE_DEFAULT_ERROR_MODE | CREATE_NO_WINDOW | DETACHED_PROCESS , 0, 0, 
     &siStartupInfo, &piProcessInfo) != false) 
    { 
     /* Watch the process. */ 
     dwExitCode = WaitForSingleObject(piProcessInfo.hProcess, (2 * 1000)); 
    } 
    else 
    { 

     /* CreateProcess failed */ 
     iReturnVal = GetLastError(); 
    } 

这将使尤尔过程独立。我希望这可以帮助你。

+0

将标志'CREATE_NO_WINDOW'与'DETACHED_PROCESS'组合起来是没有意义的。如果应用程序不是控制台应用程序,或者它与CREATE_NEW_CONSOLE或DETACHED_PROCESS一起使用,则会忽略CREATE_NO_WINDOW标志。请参阅https://msdn.microsoft.com/en-us/library/windows/desktop/ms684863(v=vs.85).aspx – 2017-02-10 14:52:09

相关问题