Premendo più volte ctrl-c, il programma in esecuzione si chiude più rapidamente?


41

Comincio spesso a leggere un file di grandi dimensioni e dopo un po 'voglio uscire, ma c'è un ritardo nel premere
Ctrl+ Cper interrompere il programma. È possibile ridurre il ritardo premendo più volte il tasto Ctrl+ C? O sto sprecando i miei tasti premuti?


Ho notato che durante l'esecuzione di un processo che chiama vari processi figlio, Ctrl-C a volte interrompe il figlio in esecuzione, ma non il processo padre. Questo è vero bash, ma non nel caso in zshcui si chiude sempre il genitore. È uno dei motivi che mi piacciono zsh.
joeytwiddle,

17
Sì, proprio come premere ripetutamente il pulsante dell'ascensore o il pulsante di camminata incrociata, l'ascensore verrà prima o la luce diventerà verde più velocemente.
Michael,

3
Sì, proprio come i pulsanti ascensore e attraversamento pedonale, CTRL-C può anche diventare appiccicoso o arrugginito o sviluppare connessioni iffy. Premere più volte è una buona tattica perché solo una pressione deve registrarsi affinché l'ascensore arrivi, il segnale di marcia si accenda o il programma si chiuda.
hippietrail,

1
@hippietrail ma la tua shell verrà stampata ^Cquando registra la stampa (almeno bash)
wchargin

1
Per quello che vale, non lo considero sprecare i miei tasti premuti - lo considero sfogare un po 'di frustrazione in modo non dannoso. (Di solito lo colpisco 2-3 volte, ma in parte perché sono "cresciuto" su terminali collegati su linee telefoniche dove non si poteva sempre contare su ogni singola pressione di un tasto che raggiungesse la macchina.)
keshlam

Risposte:


35

Dopo il primo Ctrl-C, il programma riceverà SIGINTe di solito inizia la pulizia (eliminazione dei file tmp, chiusura dei socket, ecc.). Se colpisci di Ctrl-Cnuovo mentre è in corso, può succedere che tu interrompa la routine di pulizia (cioè il segnale aggiuntivo potrebbe essere attivato invece di essere lasciato solo), lasciando un pasticcio dietro. Anche se di solito non è così, più comunemente i segnali aggiuntivi vengono effettivamente inviati dopoil processo è terminato (a causa dei ritardi inerenti all'interazione dell'operatore con il sistema). Ciò significa che i segnali vengono ricevuti da un altro processo (spesso shell, ma non sempre). Se quel destinatario non gestisce correttamente questo segnale (come accade di solito nella shell - vedi la risposta di Jenny D) potresti essere spiacevolmente sorpreso dal risultato di tale azione.


Perché dovrebbe interrompere la routine di pulizia? È solo un altro segnale INTche il processo riceve.
caos,

4
@chaos Perché dovrebbe? Dovrebbe se la routine di pulizia si è interrotta e si desidera interromperla. Funziona davvero in questo modo? Sì, abbastanza spesso. Puoi dimostrarlo abbastanza semplicemente: crea uno script bash con la sola riga trap "sleep 20 || echo clean up cancelled!" EXIT ; sleep 10. Esegui lo script e premi due volte ctrl-C. Vedrai che il secondo ctrl-C viene passato alla routine "clean up" (nell'istruzione trap) e termina il suo sleepcomando.
Giovanni 1024,

1
@ John1024 Ah, ora lo vedo. Grazie per lo snippet di script ^^ Ma la pulizia non viene annullata, vedi: trap "sleep 20 || echo clean up cancelled!; sleep 10; echo 'but continued'" EXIT ; sleep 10sono solo i sleepcomandi a ricevere i segnali. Avevamo entrambi torto xD
caos il

2
Non è corretto La consegna del segnale è sincrona. Se isigè attivo, non appena CTRL-C viene premuto e ricevuto dal kernel (per un emulatore di terminale, non appena l'emulatore di terminale lo scrive sul lato principale dello pseudo-terminale), il segnale SIGINT viene inviato a tutti i processi nel gruppo di processi in primo piano del terminale. Potrebbe essere bloccato lì, ma non verrà consegnato in seguito a un altro processo. Anche se il buffer del dispositivo terminale è pieno (le applicazioni non hanno letto nessuna delle cose digitate), il CTRL-C salterà la coda.
Stéphane Chazelas,

1
Sì, ad esempio, VLC interpreta più segnali Ctrl + C come un modo per uscire in modo impuro, mentre un singolo Ctrl + C tenterà di uscire in modo pulito.
Jeremy Visser,

11

Li stai sprecando. Tutto ciò che accade è che una volta che il server termina con l'output dello schermo, ne riceverà più Ctrl-C. Il primo verrà utilizzato per terminare il processo e i seguenti finiranno nella shell, che avrà un aspetto simile

[user@server]$ ^C
[user@server]$ ^C
[user@server]$ ^C
[user@server]$ ^C
[user@server]$ ^C
[user@server]$ 

6
Il processo non termina necessariamente quando si invia un SIGINT. Potrebbe rimanere in vita indefinitamente e fare qualcosa di diverso ogni volta che si preme Ctrl + C.
Brian Gordon,

Vero. Stavo facendo ipotesi su come l'utente sta leggendo il file.
Jenny D,

5

Risposta breve : se il processo reagisce ad esso.

Risposta lunga : quando si preme ctrl+ cil kernel invia un segnale al processo. Quale segnale può essere determinato dal seguente comando:

user@host:~# stty -a | grep -i "\^C"
intr = ^C; quit = ^\; erase = ^?; kill = ^U; eof = ^D; eol = <undef>;

Vedi la pagina man di stty:

   intr CHAR
          CHAR will send an interrupt signal

È il segnale INT, noto anche come numero 2. Quando il processo ha un gestore di segnale, può reagire a questo. La maggior parte dei processi esegue alcuni processi di pulizia per terminare correttamente.


Ctrl-Z di solito invia SIGTSTP che può essere gestito (a differenza di SIGSTOP).
peterph,

4
No, non è la shell che invia SIGINT al processo. È la kernel(disciplina di linea del terminale, il driver del terminale) che invia SIGINT a ogni processo nel gruppo di processi in primo piano del terminale.
Stéphane Chazelas,

Lettori futuri, vedere anche unix.stackexchange.com/a/120071/135943 .
Wildcard

4

Hai ragione. I tasti premuti vengono sprecati. Quando si preme Crtl+Ce viene rilevato, ci sono risorse che devono essere cancellate, motivo per cui ci vuole tempo. L'unico caso possibile che so dove Ctrl+Cè richiesta la pressione è quando si desidera annullare un processo di aggiornamento di Yum, in cui Yum richiede di premere Ctrl+Cdue volte per confermare che si desidera annullare.


2

Anche se solo uno Ctrl-Cè necessario nel caso generale, ci sono alcune situazioni in cui può essere necessario. Python, ad esempio, esegue il trap Ctrl-Cquando viene generato un nuovo thread, e quindi se qualcosa va storto durante l'avvio di molti thread, è necessario rinviarlo più volte affinché possa passare al pythonprocesso genitore senza essere catturato.


1
Questo succede a me di tanto in tanto quando creo script Python multi-thread / elaborati. A volte sono necessarie diverse macchine da stampa prima che il processo principale venga ucciso.
Leo,

0

Devo sempre premere Ctrlcpiù volte. Non ho mai avuto risposta alla prima stampa e devo usarlo più volte fino a quando il sistema non si rende conto che è Ctrlcstato inviato. Sembra che in realtà manchi / perda la maggior parte di loro.

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.