ControlC não para o script .cmd na janela do Windows 7 CMD

0

Eu trabalho com vários sistemas Windows7-64. Em todos, menos em um, digitar ^ C em uma janela CMD executando um arquivo .cmd, invariavelmente (e esperançosamente), interrompe o programa. Mais importante ainda, se o script .cmd lançou um aplicativo Win32 dispendiosamente computacionalmente (chame isso de HIGHCPU), aparentemente o aplicativo HIGHCPU ouve o ^ C e sai, fazendo com que o script .cmd saia.

A máquina especial funciona como se a aplicação HIGHCPU nunca ouvisse o ^ C. Esse aplicativo simplesmente continua sendo executado. Se terminar, ou eu matar o processo, o script .cmd subitamente detecta o ^ C e pergunta se o script deve ser interrompido.

Em todas as máquinas, o ^ C age como texto com texto selecionado em outros contextos, exatamente como você espera.

Verifiquei que, se eu iniciar o aplicativo HIGHCPU diretamente da linha de comando, o ^ C imediatamente fará com que ele pare de executar e saia. Canto escuro: o HIGHCPU é um aplicativo de montagem muito complexo; além disso, ele pega exceções no C usando o padrão Win32 SEH, e esse mecanismo de captura faz com que ele saia com status diferente de zero.

Tenho a impressão de que, de alguma forma, configurei o Win7 em uma máquina para tratar de alguma maneira o ControlC para janelas especiais do CMD.

    
por Ira Baxter 16.03.2014 / 02:06

1 resposta

0

Parece que meu programa HIGHCPU não estava explicitamente "habilitando o processamento ^ C". Eu adicionei a seguinte linha:

SetConsoleCtrlHandler(NULL,FALSE); // enable ^C processing by our handler

antes da linha já existente no programa de origem da HIGHCPU:

if(!SetConsoleCtrlHandler( (PHANDLER_ROUTINE) CtrlHandler, TRUE ) ) ...

e isso parece ter curado o problema.

Esta página do MS explica o que a primeira chamada faz: link

Estou um pouco surpreso com isso; Esse comportamento ^ C foi "como esperado" em todos os sistemas Windows nos quais o HIGHCPU foi executado desde 1997 (Windows / NT). Esta é a primeira vez que eu tive que fazer algo para ativá-lo. Os documentos não são claros sobre o comportamento padrão ("manipula ^ C / ignora ^ C"); Eu meio que espero que no Windows 7 alguém tenha esquecido de inicializar o status desse bit, ou mudado como ele foi inicializado.

No entanto, isso parece funcionar na caixa "engraçada" do Windows7. Eu vou descobrir daqui a alguns dias se isso quebrar o comportamento em outro lugar.

    
por 19.03.2014 / 03:22