Wie löst man SIGUSR1 und SIGUSR2 aus?

Lesezeit: 2 Minuten

Benutzeravatar von haunted85
verfolgt85

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?

Benutzeravatar von Oliver Charlesworth
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

Benutzeravatar von Евгений Кашинский
Евгений Кашинский

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 rsynces 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.).

1414840cookie-checkWie löst man SIGUSR1 und SIGUSR2 aus?

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy