Como o prompt de comando sabe quando esperar pela saída?

90

Eu estava tentando fazer uma recodificação do prompt de comando do Windows em C #. Eu queria saber como o prompt de comando sabe quando esperar que o processo comece a sair e quando não esperar que o processo chamado saia.

Por exemplo, se você digitar no prompt de comando "notepad", o Notepad será iniciado, mas você ainda poderá executar outros comandos. No entanto, se você abrir um utilitário como more.com, ping.exe ou outro utilitário, ele aguardará a conclusão do programa em execução antes de permitir que você execute outro comando.

Como o prompt de comando sabe quando esperar pela saída e como esse comportamento pode ser emulado em C #?

Justin Krejcha
fonte
13
Ótima primeira pergunta!
Rotem
2
No nível mais básico, os programas baseados em GUI são chamados e a execução volta ao prompt. Pode ser porque o shell não espera que o comando interaja com ele?
shahkalpesh

Respostas:

122

Se o aplicativo for um aplicativo Win32 GUI, ele apenas será executado e o prompt de comando não aguardará sua saída.

Se o aplicativo for um aplicativo de console, ele será executado no prompt de comando e você precisará aguardar sua conclusão para obter o prompt de comando de volta.

EDITAR:

ESTÁ BEM. Parece que você precisa de uma explicação técnica. Se você deseja emular o mesmo recurso em seu aplicativo, pode verificar os IMAGE_OPTIONAL_HEADERarquivos EXE aqui .

Dentro IMAGE_OPTIONAL_HEADER, existe:

 WORD                 Subsystem;

If SubSystem == 0x02 significa que é um aplicativo GUI.

If SubSystem == 0x03 significa que é um aplicativo de prompt de comando.

EDIT 2:

Se você quiser vê-lo em ação:

  1. Baixe http://www.ntcore.com/exsuite.php

  2. Copie calc.exe ou notepad.exe para sua área de trabalho

  3. Abra calc.exe copiado no CFF Explorer

  4. Navegue até Nt Headers -> Optional Headers

  5. Alterar o subsistema de 0x002 para 0x003

  6. Salve isso

Agora execute o novo calc modificado e você verá o prompt de comando aguardar que ele seja encerrado.

72DFBF5B A0DF5BE9
fonte
2
@SudhakarTillapudi, de nada, atualizei a resposta com mais detalhes, espero que explique mais.
72DFBF5B A0DF5BE9
3
é realmente informativo mais uma vez, obrigado por me lembrar :)
Sudhakar Tillapudi
8

O padrão em um prompt de comando é gerar o programa GUI em um processo / bifurcação separado. No entanto, você pode executar o bloco de notas (ou outro programa GUI) em linha com seu prompt de comando / script de shell:

start /w notepad.exe

Dessa forma, o prompt de comando / script de shell só continua depois que o processo notepad.exe termina.

Espero que ajude, TW

Tw Bert
fonte
3

Quando você inicia um novo processo, um aplicativo GUI neste contexto que realmente funciona fora dos limites do prompt, o prompt não espera. Mas, se você executar um comando que funcione inteiramente dentro dos limites da instância atual de um prompt, ele aguardará.

Portanto, o comando notepadapenas inicia o aplicativo Notepad e deixa o controle do aplicativo. Enquanto, o comando ipconfigé executado em um domínio (não, este não é um domínio de aplicativo ), do prompt.

Para generalizar extremamente, quando você usa Process.Startem seu equivalente C #, não espere. De qualquer forma, não.

dinamarquês
fonte