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
Antwort
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.
Ein 'volatile' ist möglicherweise nicht ausreichend. Entweder wir '_Atomic()' Variablen oder 'sig_atomic_t'. – Olaf
@Olaf, Danke, fügte ein sig_atomic_t hinzu. – user2394284
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). –
- 1. Wie ändert sich die Umstellung von DataContex?
- 2. Wie ändert sich die Codierung?
- 3. Wie ändert man die Stile, wenn sich die Route ändert?
- 4. Wie ändert sich die Variable in Abhängigkeit von Element geklickt
- 5. Wie ändert sich die Schriftgröße in Abhängigkeit von der Stringlänge?
- 6. Wie ändert sich die Einstellung von docker0 in CoreOS?
- 7. Wie ändert sich die Stapelreihenfolge von Textbeschriftungen in JavaScript?
- 8. Wie ändert sich die Codierung von UserAgent in HttpWebRequest?
- 9. Wert im Wörterbuch ändert sich, wenn sich die Variable ändert
- 10. Wie ändert sich die Erfolgsmeldung der Formularerweiterung?
- 11. Wie ändert sich die Deckkraft des Hintergrundbildes?
- 12. Empfangen von SIGTERM von OS
- 13. TinyMCE 4 Wie ändert sich die Schriftgröße?
- 14. Wie ändert sich die Wochentagsreihenfolge in JTCalenderView in iOS?
- 15. Wie ändert sich der Wert von PHP?
- 16. Wie ändert sich der Wert von HashMap?
- 17. Wie ändert sich die Schriftgröße des Metrolabel von MetroFramework?
- 18. Python2: ‚../‘ die Bedeutung von
- 19. Wie ändert sich die Struktur übergeordnete Variablen von der Deklaration?
- 20. Wie ändert sich die JTree-Ansicht dynamisch, wenn sich der Status eines Knotenobjekts ändert?
- 21. Wie ändert sich der Ansichtsordner in Laravel5?
- 22. Julia 0.4.7: Wie SIGTERM fangen
- 23. Kamerabestätigung ändert sich in Porträt von Landschaft
- 24. Das Etikett ändert sich nicht, wenn sich die Sprache ändert, während die App läuft.
- 25. haskells Klammer auf SIGTERM
- 26. Wie ändert sich die Logcat-Schriftgröße in Android Studio 1.0.0?
- 27. Wie ändert sich die Anzahl der Bau Threads in Xcode?
- 28. Wie ändert sich die Farbe der Statusleiste in Android?
- 29. Python - Wie ändert sich die automatische Textfarbe in einem Kreisdiagramm?
- 30. Wie ändert sich die Anzahl der Kerne in Funken?
checkout 'sigaction', um SIGTERM oder SIGINT oder andere Signale abzufangen. –
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. –