Cosa fa esattamente se clicco nella finestra di cmd?


45

Supponiamo di eseguire cmd.exe e eseguire il ping localhost. Dopodiché eseguo nuovamente il ping di localhost ma faccio clic nella finestra e il ping si interrompe fino a quando non premo Invio .

Cosa succede esattamente quando faccio clic nella finestra? Sospende il processo o qualcos'altro? Ho allegato uno screenshot per chiarire questo problema.

Nota: in realtà non faccio clic ma trascino usando il mouse che crea una finestra bianca nella finestra, come puoi vedere nello screenshot.

Modifica: ulteriori chiarimenti: Quello che vorrei davvero sapere è se trascinare la finestra interrompe il processo cmd o no?

Modifica: ancora più chiarimenti: so che sto usando Modifica rapida e premendo Invio copia i contenuti che ho selezionato. Quello che non so è cosa succede in background.

inserisci qui la descrizione dell'immagine


2
A proposito, puoi votare su UserVoice per cambiare questo comportamento: wpdev.uservoice.com/forums/…
Carl Walsh,

Bello. Ho votato a riguardo.
Adam Arold,

La votazione mi sta portando a una pagina 404
Kelly Bang,

1
E, soprattutto, ecco come disattivare questa terribile funzionalità di Dio su stackoverflow.com/a/37578608/463967
Alan Macdonald

Risposte:


27

Quando si seleziona del testo nella finestra cmd.exe, il processo proseguirà in background fino alla successiva scrittura su Output standard (o STDOUT, il flusso di dati che viene visualizzato nella finestra cmd.exe).

Quando si esce dalla modalità di selezione, il processo riprenderà normalmente.

È possibile verificarlo digitando ping www.google.com -tnella finestra cmd.exe e selezionando alcune aree dell'output. Lo vedrai in pausa e quando deselezionerai l'output riprenderà.

Modifica: come da commento di Fran, puoi usare uno strumento come Wireshark per vedere che l'attività continua ancora dopo il punto in cui hai effettuato la selezione, e poi si interrompe.


3
Questo da solo non lo prova. È inoltre necessario eseguire Wireshark e vedere se i pacchetti ICMP smettono di essere inviati. In tal caso, hai ragione nel sospendere il processo. In caso contrario, il processo non viene sospeso e l'output viene semplicemente bufferizzato (fino a quando i buffer non si riempiono, quindi verrà sospeso o i dati andranno persi).
Fran,

1
Sono abbastanza sicuro che @Fran abbia ragione: non appare un sacco di output in una volta, se hai aspettato abbastanza a lungo in modalità di selezione?
Izkata,

1
Questo mi ha infastidito molto, ma ho scoperto che se vai alle proprietà delle finestre cmd puoi deselezionare "Modalità modifica rapida" e non entrerai nella modalità di selezione facendo clic nella finestra.
Zitrax,

2
@Zitrax sì, è così che puoi evitare che ciò accada accidentalmente. Copio spesso cose dalla mia finestra di comando, quindi non lo faccio. (bene, in realtà uso Consolez che non ha questo problema)
JohnL

1
Questo si chiama " blocco " ... ovvero: l'applicazione chiama write()ma si blocca.
Attie

50

Dopo aver fatto clic nella finestra del prompt dei comandi, l'host della console non consentirà più la scrittura dell'output. L'applicazione stessa continua a funzionare, ma nulla è scritto sullo schermo.

Ovviamente, fintanto che esiste un solo thread, questo è fondamentalmente la stessa cosa che avere il processo congelato. Mentre il singolo thread tenta di scrivere un po 'di output prima di fare più lavoro.

Se corro ping -t localhoste faccio clic nella finestra del prompt dei comandi, posso quindi esaminare lo stack di chiamate del ping.exethread principale con Process Explorer .

inserisci qui la descrizione dell'immagine

Possiamo vedere che ha ping.exeprovato a scrivere un output. Ha chiamato write()nella libreria di runtime C. Tale funzione, ad un certo punto, chiama GetConsoleMode . A quanto pare, quella funzione verificherà se l'utente è attualmente in modalità contrassegno e blocca l'esecuzione se necessario.

Ulteriore analisi

Possiamo ulteriormente provare questo comportamento esaminando il comportamento di pingcon Wireshark

Durante l'esecuzione ping -t superuser.comvediamo il seguente output in Wireshark:
inserisci qui la descrizione dell'immagine

Ora, contrassegniamo una casella nel prompt dei comandi.
inserisci qui la descrizione dell'immagine
All'improvviso, non vengono più registrati ping in Wireshark. pingnon sta più inviando alcun pacchetto.

Ma sapevamo già che ...

Bene, vediamo se l'output è effettivamente il problema qui! Indirizziamo l'output al NULdispositivo:

inserisci qui la descrizione dell'immagine

Ora, non c'è più alcun risultato. Ora possiamo contrassegnare il testo nella casella per tutto il giorno, i pacchetti verranno registrati in Wireshark.

inserisci qui la descrizione dell'immagine


Se non avessi fatto +1 per la risposta originale, farei +1 ora per "Ulteriori analisi"
JohnL

6

Questo perché la finestra è entrata in modalità Mark. Quando premi Invio, copia il testo selezionato negli appunti. Per quanto ne so, non esiste alcuna impostazione per questo, quindi non sono sicuro del perché lo faccia quando si fa semplicemente clic nella finestra. Normalmente devi fare clic destro e premere "Mark". Verificare che nessun tasto sia bloccato sulla tastiera.


E cosa fa "Mark mode"? Sospende il processo?
Adam Arold,

La modalità Contrassegna viene utilizzata per copiare il testo dalla finestra di comando. AFAIK che è l'unico uso, anche se suppongo che potrebbero essercene altri.
Garrett,

7
L'impostazione si chiama Modalità modifica rapida. Fai clic sull'icona nell'angolo in alto a sinistra, scegli Proprietà e Scegli la modalità Modifica rapida nella scheda Opzioni. Da quello che so, il processo continuerà in background fino a quando non dovrà interagire con la console, a quel punto si bloccherà
JohnL

@JohnL crea una risposta perché il tuo commento è quello che sto cercando.
Adam Arold,

@edem Aggiunta una risposta :)
JohnL

6

Le finestre CMD sono in modalità di modifica rapida che accede automaticamente alla modalità di modifica quando si fa clic sullo schermo. Invio è per copiare il testo nella casella bianca ed uscire dalla modalità di modifica.

Normalmente CMD accede alla modalità di modifica solo quando si fa clic con il pulsante destro del mouse sullo schermo nero e si seleziona Mark.

Per tornare alla normalità, fare clic con il tasto destro sulla barra del titolo delle finestre e selezionare Proprietà, selezionare la scheda Opzioni e deselezionare "Modalità modifica rapida" e fare clic su OK.


3

Quando si seleziona il testo da copiare dalla finestra (in Markmodalità), il sistema sospende il processo corrente in quella finestra.

Esempio di file batch:

:test
echo %0
goto test

quando viene eseguito, non appena segnare l'area da copiare, lo schermo smette di scorrere


Stavo per pubblicare la stessa identica cosa (tranne per il fatto che il mio file batch era echo blah↵%0). :-)
Synetech,

1

Come tutti hanno ben sottolineato, l'avanzamento dell'output aggiuntivo viene bloccato mentre è in corso un'operazione di contrassegno. Inoltre, sia con il clic alternativo del mouse (tasto destro per impostazione predefinita) sia premendo il tasto Invio sulla tastiera è possibile uscire dalla modalità Contrassegno e copiare la selezione contrassegnata nel buffer di incollaggio di Windows. C'è un'altra via d'uscita, ovvero premere il tasto Esc per abbandonare la marcatura di un'area dello schermo e rilasciare il blocco in uscita. Ciò presuppone che sia selezionata la modalità QuickEdit nelle proprietà della finestra di comando. Puoi anche entrare in questa situazione più deliberatamente dicendo alla finestra di comando che vuoi selezionare del testo.


0

Per confermare ulteriormente l'affermazione che il processo si interrompe in "Modalità Mark", ad esempio durante un clic o trascinamento del mouse all'interno dei bordi della finestra di cmd.exe, ma interrompe qualsiasi operazione solo dopo aver terminato completamente con l'istanza in corso, offro una prova indiretta:

[1378:000f][2018-10-08T13:26:20] END: Verifying package "AndroidEmulator,version=26.0.0.2"
[1378:000f][2018-10-08T13:26:20] BEGIN: Verifying package "AndroidImage_ARM_API23,version=20.0.0.3"
[1378:000f][2018-10-08T13:26:20] Verifying package 'AndroidImage_ARM_API23,version=20.0.0.3'
[1378:000c][2018-10-08T13:26:26] SHA256 verification for 'AndroidImage_x86_API23,version=20.0.0.3\x86-23_r20.zip' succeeded. Hash: X
[1378:0025][2018-10-08T14:09:03] BEGIN: Verifying "AndroidImage_ARM_API23,version=20.0.0.3\AndroidSDKPrivateInstall.ps1"
[1378:0012][2018-10-08T14:09:03] BEGIN: Verifying "AndroidImage_ARM_API23,version=20.0.0.3\armeabi-v7a-23_r20.zip"
[1378:0012][2018-10-08T14:09:03] Authenticode verification returned 0x800b0003 for path: AndroidImage_ARM_API23,version=20.0.0.3\armeabi-v7a-23_r20.zip.
[1378:0012][2018-10-08T14:09:03] Retrying validation for: AndroidImage_ARM_API23,version=20.0.0.3\armeabi-v7a-23_r20.zip
[1378:000c][2018-10-08T14:09:03] Authenticode verification returned 0x800b0003 for path: AndroidImage_x86_API23,version=20.0.0.3\x86-23_r20.zip.

Stai guardando il flusso di registrazione di un'installazione di Visual Studio in cui l'utilità della riga di comando del programma di installazione di Visual Studio sta verificando tutti i carichi di lavoro installati.

Alle 13:26:26 ho fatto clic all'interno della finestra del prompt dei comandi. L'output sullo schermo si interrompe fino alle 14:09:03 quando avrò premuto Invio per uscire da "Mark mode".

Ora noti che dopo 13:26:26 il processo termina per controllare l'hash x86-23_r20.zip, il messaggio "ha avuto successo. Hash: X " e riavvia con un altro file alle 14:09:03, il messaggio " INIZIA: Verifica" [..] AndroidSDKPrivateInstall.ps1 "

Durante la pausa, l'utilità della riga di comando del programma di installazione di Visual Studio ha concluso la verifica del file che stava elaborando e esattamente nel momento in cui il controllo doveva essere restituito alla console, ha avviato un nuovo lavoro di verifica dell'hash.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.