Warum würde die zweimalige Eingabe von Strg + C einen laufenden Prozess unter Linux stoppen?

24

Es gibt Linux-Programme, zum Beispiel vlc, die empfehlen, ctrl+ czweimal einzugeben, um die Ausführung von einem Terminal aus abzubrechen, wenn das Programm nicht nach dem ersten gestoppt wurde.

Warum sollte die Eingabe von ctrl+ czweimal funktionieren, wenn das erste Mal nicht funktioniert hat?

719016
quelle
6
[Zitieren benötigt]
Ignacio Vazquez-Abrams

Antworten:

35

Was es tut, ist völlig anwendungsspezifisch. Wenn Sie ctrl+ drücken c, sendet der Terminalemulator ein SIGINT- Signal an die Vordergrundanwendung, das den entsprechenden "Signalhandler" auslöst. Der Standard-Signal-Handler für SIGINT beendet die Anwendung. Jedes Programm kann jedoch einen eigenen Signal-Handler für SIGINT installieren (einschließlich eines Signal-Handlers, der die Ausführung überhaupt nicht anhält).

Anscheinend installiert vlc einen Signal-Handler, der beim ersten Aufrufen versucht, eine Bereinigung / ordnungsgemäße Beendigung durchzuführen , und beim zweiten Aufrufen auf das Standardverhalten zurückgreift, bei dem die Ausführung sofort beendet wird.

Riccardo Murri
quelle
3
Auf einigen Systemen wird das Signal nach einem Aufruf des Handlers auf SIG_DFL zurückgesetzt (um zu vermeiden, dass der Handler zweimal auf demselben Signal aufgerufen wird). Dies wird als SysV-Semantik bezeichnet. Viele Programme setzen den Signal-Handler nicht auf die ursprünglichen Programmeinstellungen am Ende des Handlers zurück. Dies wäre normalerweise ein Programmierfehler. Weitere Informationen finden Sie auf der Hilfeseite signal (2) .
Arcege
16

SIGINT , das von Ctrl+ gesendete Signal C, weist ein Programm üblicherweise an, in seine Hauptbefehlsverarbeitungsschleife auszubrechen oder, wenn dies keinen Sinn ergibt, sauber zu beenden. Einige Programme führen eine Bereinigungsprozedur aus, wenn sie ein SIGINT erhalten. Wenn das Programm so durcheinander ist, dass die Bereinigung fehlschlägt, wird das Programm in einigen Programmen durch eine Sekunde Ctrl+ Csofort beendet. Dies zu tun, liegt bei jedem Programmautor.

Wenn ein zweite Ctrl+ Cwird das Programm nicht töten, versuchen Ctrl+ \, die senden SIGQUIT , ein heftiges (aber immer noch abfangbare Signal), oder versuchen Ctrl+ Zzu suspendieren das Programm und dann der killBefehl (zBkill %1 welche sendet SIGTERM , ein konventionell weniger heftig Signal als SIGQUIT, um Job Nummer 1). Wenn alle Stricke reißen, tötet das Programm mit kill -KILL, auch bekannt als kill -9das uncatchable Signal sendet SIGKILL .

Gilles 'SO - hör auf böse zu sein'
quelle