C Programmation

Signaux POSIX avec programmation C

Signaux POSIX avec programmation C
Nous pouvons définir un signal comme une activité qui est déclenchée pour alerter une opération ou un fil à chaque fois que l'heure d'arrivée d'une certaine situation significative. Chaque fois qu'une procédure ou un thread reconnaît un signal, la procédure ou le thread arrête tout ce qu'il fait et prend des mesures immédiates. Dans la coordination inter-processus, le signal peut être efficace. Dans ce guide, vous étudierez les gestionnaires de signaux sous Linux via le langage C.

Signaux standards ou réguliers :

Le fichier d'en-tête 'signal.h' contient des signaux spécifiés en tant que constante macro. Le titre du signal commence par « SIG » et est précédé d'un bref aperçu du signal. Par conséquent, tout signal a une valeur numérique distincte. Le code du programme doit utiliser le nom du signal, pas plusieurs signaux. La cause derrière cela est que le nombre de signaux peut varier en fonction du système, mais l'interprétation des noms est standard. Vous trouverez ci-dessous quelques signaux réguliers avec leur fonctionnalité définie.

S'INSCRIRE :

Ce signal raccrochera le traitement. Le signal SIGHUP est rejeté pour indiquer la dissociation du terminal utilisateur, probablement en raison d'une communication à distance interrompue ou interrompue.

SIGNATURE :

Cela perturbera le processus. Le signal SIGINT est reçu chaque fois que l'utilisateur saisit la touche INTR (généralement Ctrl + C).

SIGQUIT :

Il arrêtera ou quittera le traitement. Le signal SIGQUIT est reçu chaque fois que l'utilisateur saisit la touche QUIT (généralement Ctrl + \).

SIGILLE :

Il s'exécute lorsqu'une commande illicite a été effectuée. Le signal SIGILL est créé chaque fois qu'un effort est fait pour exécuter une commande indésirable ou privilégiée. Chaque fois que la pile déborde et que la machine a des problèmes pour exécuter un contrôleur de signal, SIGILL peut également être créé.

SIGTRAP :

Il est appelé lorsqu'une instruction trace trap est en cours d'exécution. Le signal SIGTRAP est créé par une commande de point d'arrêt et une autre commande de trap. Le débogueur utilise un tel signal.

SIGABRT :

C'est ce qu'on appelle le signal d'abandon. Le signal SIGABRT est créé en appelant la méthode abort(). Un tel signal est utilisé pour signaler l'imprécision constatée par le code précité et enregistrée par l'appel de la méthode abort().

SIGFPE :

Exception pour les virgules flottantes ; Le signal SIGFPE est produit lorsqu'une erreur mathématique catastrophique se produit.

SIGUSR1 et SIGUSR2 :

Les signaux SIGUSR1 et SIGUSR2 peuvent être utilisés comme vous le souhaitez. Il est avantageux pour une interaction interprocessus facile de créer un gestionnaire de signaux pour ces signaux dans l'application qui obtient le signal.

Comportement par défaut des signaux :

Il existe un comportement ou une action standard pour chaque signal, et il est possible d'ajuster le comportement par défaut à l'aide de la fonction de gestionnaire. Le comportement automatique des signaux SIGKILL et SIGABRT n'a pas pu être modifié ou négligé.

Terme: Il mettra fin à l'opération.

Cœur: Un document de vidage de mémoire sera généré et l'opération sera terminée.

Ign : Le processus négligerait un signal.

Arrêter: Cela arrêtera l'opération.

Suite : L'opération sera maintenue après l'arrêt.

Traitement des signaux :

Le processus a une préférence de comportement pour un signal lorsqu'il est acquitté. Le processus peut se comporter comme suit :

Le signal est automatiquement rejeté lorsque le comportement du signal défini est ignoré.

En utilisant des méthodes telles que signal ou sigaction, le code peut enregistrer une fonction de gestionnaire. C'est ce qu'on appelle capter un signal d'un gestionnaire.

Si un signal n'est pas traité ou négligé, l'action standard peut se produire.

Vous pouvez définir la fonction de traitement du signal comme :

$ Int signal () int signum, void (*funk)(int))

Lorsque le traitement obtient un signum de signal, la méthode signal() peut appeler la méthode 'func'. Signal() renvoie un pointeur vers la méthode 'func' si elle est prospère ou si une exception est renvoyée à errno et -1 à la place.

Le pointeur 'func' est capable d'avoir trois valeurs :

SIG_DFL : Ceci est un pointeur vers la méthode standard SIG DFL(), définie dans l'en-tête.h document utilisé pour obtenir le comportement standard du signal.

SIG_IGN : Ceci est une référence à la méthode d'ignorer SIG IGN(), spécifiée dans l'en-tête.h document.

Pointeur de méthode de gestionnaire défini par l'utilisateur : Le type de méthode de gestionnaire défini par l'utilisateur void(*)(int), implique que la catégorie de retour est void et que l'argument solitaire est int.

Créer un nouveau fichier 'signal.c' et écrivez ci-dessous le code du gestionnaire de signal dedans.

Lier le signal.c avec gcc.

Pendant l'exécution du signal.c, nous avons une boucle sans fin exécutée dans la méthode principale. En appuyant sur CTRL + C, il a démarré la méthode du gestionnaire et l'exécution de la méthode principale s'est arrêtée. Le traitement de la méthode principale s'est poursuivi après l'accomplissement de la méthode du gestionnaire. En appuyant sur Ctrl+\, l'opération se termine.

Ignorer le signal :

Pour surveiller le signal, créez un fichier 'signal.c' et écrivez sous le code dedans.

Attachez l'ignorer.c avec gcc.

Exécuter le signal.fichier c. Appuyez sur CTRL+C, le signal SIGNIT est créé ; néanmoins, le comportement passe inaperçu car la méthode du gestionnaire est énumérée à la méthode SIG_IGN().

Réenregistrer le gestionnaire de signaux :

Pour réenregistrer le gestionnaire de signal, créez un nouveau fichier 'rereg.c' et insérez-y le code ci-dessous :

Associer le rereg.c avec gcc.

Exécutez le rereg.fichier c. Lors de la première pression sur CTRL + C, la méthode du gestionnaire est levée et le gestionnaire de signal est réenregistré sur SIG_DFL. En appuyant à nouveau sur CTRL + C, l'exécution s'est terminée.

Envoyer des signaux à l'aide de Raise() :

Créer un fichier 'envoyer.c' et ajoutez le code ci-dessous. Pour envoyer des signaux à la méthode appelante, la méthode raise() est utilisée.

Relier l'envoi.c avec gcc.

Le processus utilise la méthode raise() pour transmettre le signal SIGUSR1 par lui-même.

Envoyer des signaux à l'aide de Kill() :

Ajoutez le code ci-dessous dans 'raise.c'est. Utilisez la méthode kill() pour envoyer des signaux au groupe de processus.

Lier l'augmentation.c avec gcc.

En utilisant la méthode kill(), le processus dirige le signal SIGUSR1 vers le.

Interaction parent-enfant :

Pour regarder l'interaction parent-enfant, écrivez le code ci-dessous dans un fichier.

Reliez la communication.c avec gcc.

La méthode Fork ()/ génère un enfant, rétablit zéro au processus enfant et l'ID enfant au parent.

Conclusion:

Dans ce guide, nous avons vu comment créer, gérer, envoyer, ignorer, réenregistrer et utiliser le signal pour l'interaction inter-processus sous Linux.

Tutoriel Shadow of the Tomb Raider pour Linux
Shadow of the Tomb Raider est le douzième ajout à la série Tomb Raider - une franchise de jeux d'action-aventure créée par Eidos Montréal. Le jeu a ét...
Comment booster les FPS sous Linux?
FPS signifie Images par seconde. La tâche du FPS est de mesurer la fréquence d'images dans les lectures vidéo ou les performances de jeu. En termes si...
Meilleurs jeux de laboratoire d'applications Oculus
Si vous êtes propriétaire d'un casque Oculus, vous devez être au courant du chargement latéral. Le chargement latéral est le processus d'installation ...