web-dev-qa-db-fra.com

Comment déclencher SIGUSR1 et SIGUSR2?

Je commence à me familiariser avec les signaux en C. Je ne sais pas quel type de signaux SIGUSR1 et SIGUSR2 sont et comment puis-je les déclencher. Quelqu'un peut-il m'expliquer s'il vous plaît?

47
haunted85

Ce sont des signaux définis par l'utilisateur, ils ne sont donc déclenchés par aucune action particulière. Vous pouvez les envoyer explicitement par programme:

#include <signal.h>

kill(pid, SIGUSR1);

pid est l'ID de processus du processus de réception. A la réception, vous pouvez enregistrer un gestionnaire de signaux pour eux:

#include <signal.h>

void my_handler(int signum)
{
    if (signum == SIGUSR1)
    {
        printf("Received SIGUSR1!\n");
    }
}

signal(SIGUSR1, my_handler);
69

Ce sont des signaux que les développeurs d'applications utilisent. Le noyau ne devrait jamais les envoyer à un processus. Vous pouvez les envoyer en utilisant kill(2) ou en utilisant l'utilitaire kill(1).

Si vous souhaitez utiliser des signaux pour la synchronisation, vous pouvez vérifier les signaux en temps réel (ils sont plus nombreux, ils sont mis en file d'attente, leur ordre de livraison est garanti, etc.).

6
cnicutar

terminal 1

dd if=/dev/sda of=debian.img

terminal 2

killall -SIGUSR1 dd

retourner au terminal 1

34292201+0 records in
34292200+0 records out
17557606400 bytes (18 GB) copied, 1034.7 s, 17.0 MB/s