Verwendung von Signalen unter Linux

1. Das Grundkonzept des Signals

Ein Signal ist ein Ereignis, das vom System als Reaktion auf eine bestimmte Bedingung generiert wird, und der Prozess führt die entsprechende Aktion nach Empfang des Signals aus.

2. Die entsprechende Methode zum Modifizieren des Signals - signal()

Verwenden Sie signal(), um das angegebene Signal zu ändern
. Ignorieren Sie das Signal: SIG_IGN
Standardverarbeitung: SIG_DFL
Benutzerdefiniert: Signalverarbeitungsfunktion, die Sie selbst geschrieben haben

Beispiel 1:
Das folgende Programm zeigt beispielsweise, dass das Signal SIGINT (das Signal wird generiert, wenn Strg+C auf der Tastatur gedrückt wird) in einen benutzerdefinierten Fun-Handler geändert wird

#include<stdio.h>
#include<stdlib.h>
#include<unistd.h>
#include<assert.h>
void fun(int sign)
{
    
    
    printf("fun was called, sign = %d\n", sign);
}
int main()
{
    
    
    signal(SIGINT, fun);
    while(1)
    {
    
    
    sleep(1);
    printf("main running\n");
    }
    exit(0);
}

Das Programm läuft wie folgt ab:
Bildbeschreibung hier einfügen

3. Sende ein Signal - kill()

kill() kann das angegebene Signal an den angegebenen Prozess senden'
int kill(pid_t pid,int sig);

pid > 0 gibt an, an welchen Prozess das Signal gesendet werden soll

pid == 0 Das Signal wird an einen Prozess in derselben Prozessgruppe wie der aktuelle Prozess gesendet

pid == -1 sendet das Signal an alle Prozesse auf dem System, die die Berechtigung zum Senden haben

pid < -1 Sendet das Signal an alle Prozesse, deren Prozessgruppen-ID gleich dem absoluten Wert von pid ist und Sendeerlaubnis hat.

sig gibt die Art des gesendeten Signals an.

Beispiel 2:
Der folgende Code bedeutet: Führen Sie dieses Programm aus, geben Sie die PID eines Prozesses ein und verwenden Sie das Signal sig, um den Prozess zu verarbeiten

#include <stdio.h>
#include <unistd.h>
#include <assert.h>
#include <signal.h>

int main(int argc, char* argv[])//pid, sig
{
    
    
    if ( argc != 3 )
    {
    
    
    printf("argc error\n");
    exit(0);
    }
    int pid = 0;
    int sig = 0;
    sscanf(argv[1],"%d",&pid); 
    sscanf(argv[2],"%d",&sig);
   if ( kill(pid,sig) == -1 )
    {
    
    
     perror("kill error");
     }
      exit(0);
}

Das Programm läuft wie folgt:
Abfrage der Prozess-ID von Beispiel 1, dann Ausführen von Beispiel 2, Beenden von Prozess 14851 (Beispiel 1) mit dem Signal SIGKILL (#define SIGKILL 9).
Bildbeschreibung hier einfügen
Bildbeschreibung hier einfügen

Ich denke du magst

Origin blog.csdn.net/m0_54355780/article/details/122790259
Empfohlen
Rangfolge