2016-11-19 7 views
-2

Ich hatte kürzlich ein Problem mit Signalen. Ich würde gerne ein Programm in C schreiben, das alles drucken würde, nachdem ein Signal an den Prozess gesendet wurde. Zum Beispiel: Wenn ich SIGTERM an meinen Prozess sende (der einfach ein Programm ausführt), möchte ich, dass das Programm zum Beispiel "den Prozess abbricht" ausgibt, anstatt den Prozess zu beenden. Also, wie geht das? Wie man den Prozess erzwingt, um die Bedeutung eines solchen Signals zu erfassen und zu ändern. Ich habe auch eine Frage, ob es eine Möglichkeit gibt, den Init-Prozess zu beenden (ich weiß, dass es eine dumme Frage ist, aber ich frage mich, wie Linux mit solch einem Signal umgeht, und wie würde es aussehen, wenn ich tippe: sudo kill -9 1.Wie ändert sich die Bedeutung von SIGTERM in C-Programm

+2

checkout 'sigaction', um SIGTERM oder SIGINT oder andere Signale abzufangen. –

+2

Sie können die Bedeutung von SIGTERM per se nicht ändern; Alles, was Sie tun können, ist, die Reaktion Ihres Programms auf das Empfangen des Signals zu ändern. Es gibt einige Signale (SIGKILL und SIGSTOP), an denen Ihr Prozess (Programm) nichts ändern kann - der Prozess kann die Standardreaktion auf diese Signale nicht ändern. –

Antwort

0

verwenden Sie die Signal-Handler nicht zu drucken. Sie volatile sig_atomic_t stattdessen eine Variable vom Typ festlegen können, und haben Sie Ihren Hauptthread dies überprüfen (this siehe Beispiel).

Wenn Ihr Hauptthread nichts anderes zu tun hat ((sollte die meiste Zeit sein), lassen Sie es bei einem blockierenden Funktionsaufruf blockieren (z. B. sleep()), der sofort beim Empfang des Signals aktiviert wird (und errno auf EINTR setzen.)


C++ Gotcha: Im Gegensatz zur C sleep() Funktion, std::this_thread::sleep_for() (in neueren Versionen von glibc) hat nicht aufwachen, wenn ein Signal empfangen wird.


In Bezug auf, ob es möglich pid 1 zu töten, siehe this question. Die Antwort scheint nein zu sein, aber ich erinnere mich, dass Linux sehr mürrisch wurde, sobald ich mit init =/bin/bash startete und später diese Shell verließ - musste hart neu starten.

Wenn Sie nach Ärger suchen, besser kill pid -1.

+0

Ein 'volatile' ist möglicherweise nicht ausreichend. Entweder wir '_Atomic()' Variablen oder 'sig_atomic_t'. – Olaf

+0

@Olaf, Danke, fügte ein sig_atomic_t hinzu. – user2394284

+0

Wenn man bedenkt, dass dies für Linux ist, nicht für Standard C, können in einem Signalhandler wesentlich mehr Dinge getan werden als in Standard C. Es gibt eine Liste von Systemaufrufen, die in [Wie vermeidet man die Verwendung von printf() 'in einem Signalhandler] (http://stackoverflow.com/questions/16891019/), zum Beispiel. Die Liste ist gelegentlich eklektisch; 'write()' ist erlaubt, aber 'strlen()' ist nicht, offiziell. Es gibt viele weitere Details im POSIX-Standard - zum Beispiel bei [Signal Concepts] (http://pubs.opengroup.org/onlinepubs/9699919799/functions/V2_chap02.html#tag_15_04). –

Verwandte Themen