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_CONSOLE
或DETACHED_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