createProcess 函数的 DETACH_PROCESS 和 CREATE_NO_WINDOW 进程创建标志有啥区别

Posted

技术标签:

【中文标题】createProcess 函数的 DETACH_PROCESS 和 CREATE_NO_WINDOW 进程创建标志有啥区别【英文标题】:What is the difference between DETACH_PROCESS and CREATE_NO_WINDOW process creation flags for createProcess functioncreateProcess 函数的 DETACH_PROCESS 和 CREATE_NO_WINDOW 进程创建标志有什么区别 【发布时间】:2011-09-16 07:14:28 【问题描述】:

我一直试图了解这两个进程创建标志之间的区别。 msdn documentation 并不清楚区别。

CREATE_NO_WINDOW 是否会导致进程有一个控制台(标准输入/输出流已初始化)而不显示窗口,而 DETACH_PROCESS 根本没有控制台? 对子进程有什么影响? 描述在每个组合(父级有控制台,父级没有控制台)X(子可执行文件需要控制台(主),子可执行文件不需要控制台(WinMain))时发生的行为矩阵是什么。 ?

【问题讨论】:

“每个组合”是什么意思? MSDN 明确指出:“如果应用程序不是控制台应用程序,或者如果它与CREATE_NEW_CONSOLEDETACHED_PROCESS 一起使用,则忽略此标志。”用于CREATE_NO_WINDOW。所以从某种意义上说,它们是相互排斥的。 我的意思是孩子和父母的组合是控制台或非控制台可执行文件。如果父应用程序是非控制台应用程序,并且我从它启动带有 DETACH_PROCESS 标志的控制台应用程序,那么如果子应用程序需要控制台,它会出错吗? 这完全取决于 C 运行时的实现。如果我没记错的话,MSVCRT 在这种情况下不会引起问题。其他运行时可能。 我发现github.com/rprichard/win32-console-docs 是获取控制台信息的绝佳资源。 【参考方案1】:

区别在于启动的进程可以做什么。在这两种情况下,它都没有控制台。但是使用CREATE_NO_WINDOW 选项,它可以调用AttachConsole(ATTACH_PARENT_PROCESS) 并访问父控制台窗口(如果可用)。当您指定 DETACH_PROCESS 时,这将明确不起作用。唯一的选择是让启动的进程使用AllocConsole() 创建自己的控制台。

或者换句话说,您可以确保启动的进程永远无法通过使用DETACH_PROCESS进入您自己的控制台。

【讨论】:

随机说明:powershell 不像 DETACH_PROCESS 那样 为了提供更多信息,CREATE_NO_WINDOW 仍然初始化一个单独的 conhost.exe 实例(只是隐藏)作为启动进程的父进程并编组进程的输入/输出,而 DETACHED_PROCESS 不创建任何“conhost” .exe' 实例。

以上是关于createProcess 函数的 DETACH_PROCESS 和 CREATE_NO_WINDOW 进程创建标志有啥区别的主要内容,如果未能解决你的问题,请参考以下文章

detach() 使用和.detach()和.data的区别

C++并发与多线程 2_线程启动结束,创建线程多种方法,join,detach

读取使用 createProcess 获得的管道的几行,然后将其关闭

Windows CreateProcess 和输出重定向

CreateProcess() API 函数有啥用?

CreateProcess函数诡异的表现