perché digitare Ctrl + c due volte interrompe un processo in esecuzione in Linux?


24

Esistono programmi Linux, ad esempio vlc, che raccomandano di digitare ctrl+ cdue volte per terminare la loro esecuzione da un terminale se il programma non si interrompe dopo il primo.

Perché digitare ctrl+ cdue volte funzionerebbe quando la prima volta non funzionava?


6
[citazione necessaria]
Ignacio Vazquez-Abrams,

Risposte:


35

Quello che fa è interamente specifico dell'applicazione. Quando si preme ctrl+ c, l'emulatore di terminale invia un segnale SIGINT all'applicazione in primo piano, che attiva il "gestore di segnale" appropriato. Il gestore di segnali predefinito per SIGINT termina l'applicazione. Ma qualsiasi programma può installare il proprio gestore di segnali per SIGINT (incluso un gestore di segnali che non interrompe affatto l'esecuzione).

Apparentemente, vlc installa un gestore di segnale che tenta di eseguire alcune operazioni di cleanup / aggraziate terminazioni al primo richiamo e torna al comportamento predefinito di terminare immediatamente l'esecuzione quando viene richiamato per la seconda volta.


3
Su alcuni sistemi, il segnale viene ripristinato a SIG_DFL dopo una chiamata al gestore (per evitare di chiamare il gestore due volte sullo stesso segnale); questo si chiama semantica SysV. Molti programmi non riportano il gestore del segnale alle impostazioni originali sul programma alla fine del gestore. Questo sarebbe normalmente un bug di programmazione. Maggiori informazioni sulla manpage signal (2) .
Arcege,

16

SIGINT , il segnale inviato da Ctrl+ C, dice convenzionalmente a un programma di uscire dal suo ciclo di elaborazione dei comandi principale, o se ciò non ha senso, per uscire in modo pulito. Alcuni programmi eseguono una procedura di pulizia quando ricevono un SIGINT. Se il programma è così incasinato che la procedura di pulizia fallisce, in alcuni programmi, un secondo Ctrl+ Cprovoca la chiusura immediata del programma. Fare questo dipende da ciascun autore del programma.

Se un secondo Ctrl+ Cnon uccide il programma, prova Ctrl+ \, che invia SIGQUIT , un segnale più violento (ma comunque catchable), oppure prova Ctrl+ Za sospendere il programma e quindi il killcomando (ad esempio, kill %1che invia SIGTERM , un segnale convenzionalmente meno violento di SIGQUIT, al numero di lavoro 1). Se tutto il resto fallisce, uccidi il programma con kill -KILL, noto anche come kill -9, inviando il segnale inattaccabile SIGKILL .

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.