Service de noyau et_wait

Objectif

Force l'unité d'exécution du noyau appelant à attendre l'occurrence d'un événement.

Syntaxe

#include <sys/types.h> #include <sys/errno.h> #include <sys/sleep.h> unsigned long et_wait ( wait_mask, clear_mask, indicateurs) unsigned long wait_mask; unsigned long clear_mask; int indicateurs;

Paramètres

Article Descriptif
Masque wait_masque Indique le masque des événements à attendre.
Masque clear_mask Indique le masque des événements à effacer.
Flags Indique les actions de contrôle des indicateurs sur l'occurrence d'un signal.

Le paramètre Indicateurs est utilisé pour contrôler la façon dont les signaux affectent l'attente d'un événement. Il existe deux valeurs d'indicateur:

EVENT_SIGRET
Entraîne l'arrêt de l'événement par un signal non masqué et la valeur de retour définie sur SIG.
EVENT_SIGWAKE
Entraîne la fin de l'événement par un signal et un contrôle non masqués transférés à la déclaration à partir du dernier appel Setjmpx , avec la valeur de retour définie sur EXSIG.
EVENT_ABRÉGÉ
Interdit l'attente d'être arrêté par un signal. Ce drapeau ne doit être utilisé que pour les traîneaux courts et garantis.
Remarque: L'indicateur EVENT_SIGRET remplace l'indicateur EVENT_SIGWAKE .

Descriptif

Le service de noyau Et_wait force l'unité d'exécution du noyau à attendre que des événements spécifiés se produisent.

Le paramètre Masque wait_masque indique un masque, où chaque bit défini égal à 1 représente un événement pour lequel l'unité d'exécution doit attendre. Le paramètre Masque clear_mask indique un masque d'événements qui doivent être effacis lorsque l'attente est terminée. Les appels ultérieurs au service Et_wait retournent immédiatement, sauf si vous effacez les bits, ce qui met fin à l'attente.

Remarque: Le service Et_wait peut être appelé avec les interruptions désactivées uniquement si l'événement ou le mot de verrouillage est bloqué.

Stratégies d'utilisation de et_wait

L'appel du service de noyau Et_wait à l'aide de l'indicateur EVENT_SIGRET efface la zone des événements en attente lorsque le signal est reçu. Si Et_wait est à nouveau appelé par la même unité d'exécution de noyau, l'unité d'exécution attend indéfiniment un événement qui s'est déjà produit. Lorsque cela se produit, l'unité d'exécution ne s'exécute pas. Cet incident se produit uniquement si l'événement et le signal sont affichés simultanément.

Pour éviter ce problème, utilisez l'une des méthodes de programmation suivantes:

  • Utilisez l'indicateur EVENT_ABRÉGÉ pour empêcher les signaux de réveiller l'unité d'exécution.
  • Masque les signaux avant l'appel de Et_wait à l'aide du service de noyau limit_sigs. Ensuite, appelez Et_wait. Appelez l'appel sigprocmask pour restaurer le masque de signal à l'aide du masque renvoyé précédemment par limit_sigs.

Le service Et_wait est également utilisé pour effacer les événements sans attendre qu'ils se produisent. Pour ce faire, procédez de l'une des mesures suivantes:

  • Définissez le paramètre Masque wait_masque sur EVENT_NDELAY.
  • Définissez les bits dans le paramètre Masque clear_mask qui correspondent aux événements à effacer sur 1.

Etant donné que le service Et_wait renvoie un masque d'événement indiquant les événements réellement supprimés, ces méthodes peuvent être utilisées pour interroger les événements.

Environnement d'exécution

Le service de noyau Et_wait peut être appelé à partir de l'environnement Processus uniquement.

Valeurs renvoyées

Une fois l'opération terminée, le service Et_wait renvoie un masque d'événement indiquant les événements qui ont mis fin à l'attente. Si une valeur EVENT_NDELAY est spécifiée, le masque d'événements renvoyé indique les événements en attente qui ont été effacis par cet appel. Sinon, il renvoie le code d'erreur suivant:

Article Descriptif
SIG Indique que l'indicateur EVENT_SIGRET est défini et que l'attente est arrêtée par un signal.