Ich mache mich mit Signalen in C vertraut. Ich kann nicht herausfinden, welche Art von Signalen SIGUSR1
und SIGUSR2
sind und wie kann ich sie auslösen. Kann mir das bitte jemand erklären?
Wie löst man SIGUSR1 und SIGUSR2 aus?
verfolgt85
Oliver Charlesworth
Sie sind benutzerdefinierten Signale, sodass sie nicht durch eine bestimmte Aktion ausgelöst werden. Sie können sie explizit programmgesteuert senden:
#include <signal.h>
kill(pid, SIGUSR1);
wo pid
ist die Prozess-ID des empfangenden Prozesses. Auf der Empfängerseite können Sie einen Signalhandler für sie registrieren:
#include <signal.h>
void my_handler(int signum)
{
if (signum == SIGUSR1)
{
printf("Received SIGUSR1!\n");
}
}
signal(SIGUSR1, my_handler);
-
Vielen Dank für Ihre Antwort. Wenn diese Signale benutzerdefiniert sind, wie können sie nützlich sein? Können Sie mir einige Beispiele nennen?
– verfolgt85
29. Mai 2011 um 15:48 Uhr
-
@haunted: Sie sind für eine einfache Kommunikation zwischen Prozessen (IPC) ausgelegt. Ein untergeordneter Prozess könnte ihn beispielsweise an seinen übergeordneten Prozess senden, um anzuzeigen, dass er eine bestimmte Aufgabe abgeschlossen hat. Offensichtlich gibt es für IPC viel ausgefeiltere Techniken (wie Pipes, Sockets, Semaphore usw.).
– Oliver Charlesworth
29. Mai 2011 um 15:48 Uhr
-
@haunted85: Ein konkretes Beispiel wäre Mongodb, das seine Protokolldateien beim Empfang von SIGUSR1 rotiert: – siehe docs.mongodb.org/manual/tutorial/rotate-log-files
– Toong
28. Februar 2013 um 8:46 Uhr
-
@haunted85 Hier ist ein Beispiel mit
SIGUSR1
für AI: linux.die.net/man/7/aio– Benutzer152949
15. April 2013 um 20:57 Uhr
-
QEMU verwendet diese Technik häufig, um ein CPU-Modell anzukurbeln.
– webbertiger
16. Dezember 2013 um 20:17 Uhr
Евгений Кашинский
Terminal 1
dd if=/dev/sda of=debian.img
Terminal 2
killall -SIGUSR1 dd
Gehen Sie zurück zu Terminal 1
34292201+0 records in
34292200+0 records out
17557606400 bytes (18 GB) copied, 1034.7 s, 17.0 MB/s
-
das funktioniert übrigens nicht mit rsync:
rsync error: received SIGUSR1 (code 19) at main.c(1434) [sender=3.1.1]
– qwertz
24. Februar 2018 um 22:08 Uhr
-
Natürlich muss es nicht funktionieren
rsync
es war nur ein Anwendungsbeispiel (hier:dd
), der einen Signalhandler für SIGUSR1 für eine nützliche Funktion einrichtet.– die fleißige Biene
23. August 2019 um 6:08 Uhr
Sie sind Signale, die Anwendungsentwickler verwenden. Der Kernel sollte diese niemals an einen Prozess senden. Sie können sie mit senden kill(2)
oder mit dem Dienstprogramm kill(1)
.
Wenn Sie beabsichtigen, Signale für die Synchronisation zu verwenden, möchten Sie vielleicht Echtzeitsignale überprüfen (es gibt mehr davon, sie sind in der Warteschlange, ihre Lieferreihenfolge ist garantiert usw.).