命令提示符如何知道何时等待退出?

89

我试图使用C#重新编写Windows命令提示符。我想知道命令提示符是如何知道何时等待启动的进程退出,以及何时不等待被调用的进程退出。

例如,如果在命令提示符中输入“notepad”,记事本将启动,但您仍然可以执行其他命令。但是,如果您打开像more.com、ping.exe或另一个实用程序,则它将在让您执行另一个命令之前等待正在执行的程序完成。

命令提示符是如何知道何时等待退出,并且如何在C#中模拟这种行为?


13
太棒的第一个问题! - Rotem
2
在非常基本的层面上,基于GUI的程序被称为“图形用户界面程序”,并且执行会回到提示符。这可能是因为shell不希望命令与其交互所致? - shahkalpesh
3个回答

122

如果应用程序是Win32 GUI应用程序,则它将直接运行,命令提示符不会等待其退出。

如果应用程序是控制台应用程序,则它将在命令提示符中运行,您需要等待它完成才能获得命令提示符返回。

编辑:

好的。看来您需要技术解释。如果您想在应用程序中模拟相同的特性,可以在此处检查EXE文件的IMAGE_OPTIONAL_HEADER 这里

IMAGE_OPTIONAL_HEADER内部有:

 WORD                 Subsystem;

If SubSystem == 0x02 表示它是一个 GUI 应用程序。

If SubSystem == 0x03 表示它是一个命令提示符应用程序。

编辑2:

如果您想看到它的实际效果:

  1. 下载 http://www.ntcore.com/exsuite.php

  2. 将 calc.exe 或 notepad.exe 复制到桌面上

  3. 在 CFF Explorer 中打开复制的 calc.exe

  4. 导航到“Nt Headers”->“Optional Headers”

  5. 将 SubSystem 从 0x002 更改为 0x003

  6. 保存它

现在运行新修改的 calc,您将看到命令提示符等待它被终止。


2
@SudhakarTillapudi,不用谢,我更新了答案并加入了更多细节,希望能够更好地解释。 - 72DFBF5B A0DF5BE9
3
非常感谢您再次提供信息,让我受益匪浅。谢谢您的提醒 :) - Sudhakar Tillapudi

8

默认情况下,命令提示符会将GUI程序分离到一个单独的进程/分支中运行。然而,你可以在命令提示符/Shell脚本中直接运行记事本(或其他GUI程序):

start /w notepad.exe

这样,命令提示符/Shell脚本在记事本.exe进程终止后才继续进行。
希望这有所帮助,TW

3
当你启动一个新的进程,一个GUI应用程序在这个上下文中实际上是在提示符的边界之外工作时,提示符不会等待。但是,如果你运行一个完全在当前提示符实例的边界内工作的命令,它会等待。
因此,命令 notepad 只是启动记事本应用程序并离开应用程序的控制。而命令 ipconfig 在提示符的域(不是应用程序域)下运行。
总的来说,当你在C#中使用Process.Start时,不要等待。它无论如何都不会等待。

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