IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Linux Discussion :

sigaddset (sigset_t *set, int signum) en posix


Sujet :

Linux

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Inscrit en
    Juillet 2009
    Messages
    81
    Détails du profil
    Informations personnelles :
    Âge : 37

    Informations forums :
    Inscription : Juillet 2009
    Messages : 81
    Par défaut sigaddset (sigset_t *set, int signum) en posix
    Salut,
    Est ce que lorsque je fais :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    sigset_t set:
    sigaddset(&set ,1000) :
    j'ajoute l'écoute sur le signal 1000: donc je suis en attente du signale 1000.
    Que permet de faire sigaddset(..) pour quelle raison on l'utilise.
    J'ai trouvé quelle ajoute à l'ensemble set le signal signum,Mais c'est pas claire!!
    Merci pour votre aide

  2. #2
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Chercheur d'emploi
    Inscrit en
    Septembre 2007
    Messages
    7 502
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Chercheur d'emploi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2007
    Messages : 7 502
    Par défaut
    Tout est là : sigsetopts.

    Ce que tu as écrit est syntaxiquement correct, à ceci près que le C utilise le point-virgule « ; » comme séparateur et pas le deux-points « : ».

    Il n'y a pas de signal 1000, sous Unix. Il n'y en a qu'une trentaine (sans compter les signaux spéciaux RTMIN et RTMAX) bien définis, et qui ont tous une signification propre. Contrairement à une idée un peu trop répandue, un signal Unix ne sert absolument pas à échanger des données. C'est une erreur fréquente car il est au nombre restreint des mécanismes permettant de communiquer avec un autre processus.

    Dans le même esprit, on ne se met pas non plus « à l'écoute » d'un signal Unix à proprement parler. C'est un événement qui est déclenché par le système lorsque la situation change de telle manière que le processus ne peut poursuivre son déroulement normalement. Par exemple : la destruction d'un tube (parce que l'autre partie a « raccroché », une segfault, la destruction du processus père, la destruction d'un fils, ou l'interruption du processus à la demande de l'utilisateur avec Ctrl-C.

    Un signal est donc « violent », dans le sens où il préempte le processus. Par défaut, cela ne se termine que de deux façons : soit ton processus est détruit (majorité des cas), soit le signal est ignoré (par exemple, si un fils meurt). Tu peux avoir la liste des signaux Unix depuis la ligne de commande en tapant kill -l. Tu peux ensuite définir si tu le souhaites un comportement personnalisé pour chaque signal, excepté SIGKILL (kill -9) et SIGSTOP.

    Pour les sigsets en particulier, il est souvent utile de définir des paramètres sur plusieurs signaux à la fois, ne serait-ce que pour rendre l'opération atomique. Dans ce cas, on passe un « jeu de signaux » (sigset) plutôt qu'un numéro unique. Il faut alors commencer par déclarer un sigset, l'initialiser et le remplir avec les numéros des signaux qui nous intéressent. On passe ensuite ce sigset à la fonction en a besoin.

    À noter que le contenu de ta variable « set » est indéfini par défaut. Comme tu ne sais pas comment est défini le type sigset_t, tu ne peux pas l'initialiser à la déclaration. Il faut donc utiliser d'abord sigemptyset() ou sigfillset(), car le résultat de ces deux fonctions est complètement indépendant de l'état précédent de « set ».

  3. #3
    Membre confirmé
    Inscrit en
    Juillet 2009
    Messages
    81
    Détails du profil
    Informations personnelles :
    Âge : 37

    Informations forums :
    Inscription : Juillet 2009
    Messages : 81
    Par défaut
    Citation Envoyé par Obsidian Voir le message
    Tout est là : sigsetopts.

    Ce que tu as écrit est syntaxiquement correct, à ceci près que le C utilise le point-virgule « ; » comme séparateur et pas le deux-points « : ».

    Il n'y a pas de signal 1000, sous Unix. Il n'y en a qu'une trentaine (sans compter les signaux spéciaux RTMIN et RTMAX) bien définis, et qui ont tous une signification propre. Contrairement à une idée un peu trop répandue, un signal Unix ne sert absolument pas à échanger des données. C'est une erreur fréquente car il est au nombre restreint des mécanismes permettant de communiquer avec un autre processus.

    Dans le même esprit, on ne se met pas non plus « à l'écoute » d'un signal Unix à proprement parler. C'est un événement qui est déclenché par le système lorsque la situation change de telle manière que le processus ne peut poursuivre son déroulement normalement. Par exemple : la destruction d'un tube (parce que l'autre partie a « raccroché », une segfault, la destruction du processus père, la destruction d'un fils, ou l'interruption du processus à la demande de l'utilisateur avec Ctrl-C.

    Un signal est donc « violent », dans le sens où il préempte le processus. Par défaut, cela ne se termine que de deux façons : soit ton processus est détruit (majorité des cas), soit le signal est ignoré (par exemple, si un fils meurt). Tu peux avoir la liste des signaux Unix depuis la ligne de commande en tapant kill -l. Tu peux ensuite définir si tu le souhaites un comportement personnalisé pour chaque signal, excepté SIGKILL (kill -9) et SIGSTOP.

    Pour les sigsets en particulier, il est souvent utile de définir des paramètres sur plusieurs signaux à la fois, ne serait-ce que pour rendre l'opération atomique. Dans ce cas, on passe un « jeu de signaux » (sigset) plutôt qu'un numéro unique. Il faut alors commencer par déclarer un sigset, l'initialiser et le remplir avec les numéros des signaux qui nous intéressent. On passe ensuite ce sigset à la fonction en a besoin.

    À noter que le contenu de ta variable « set » est indéfini par défaut. Comme tu ne sais pas comment est défini le type sigset_t, tu ne peux pas l'initialiser à la déclaration. Il faut donc utiliser d'abord sigemptyset() ou sigfillset(), car le résultat de ces deux fonctions est complètement indépendant de l'état précédent de « set ».
    Bonjour,
    Merci pour votre réponse donc set est un ensemble de signaux ,
    par exemple Si je veux interrompre un processus par un signal je dois l'ajouter a set avec sigaddset(...), sinon le processus ne peut pes connaitre le signal!!
    Merci encore

  4. #4
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Chercheur d'emploi
    Inscrit en
    Septembre 2007
    Messages
    7 502
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Chercheur d'emploi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2007
    Messages : 7 502
    Par défaut
    Citation Envoyé par amira88 Voir le message
    Bonjour, Merci pour votre réponse donc set est un ensemble de signaux
    Sémantiquement, oui. Plus précisément, c'est un ensemble de numéros qui correspondent aux signaux qui t'intéressent.

    par exemple Si je veux interrompre un processus par un signal je dois l'ajouter a set avec sigaddset(...),
    Non. Ce n'est pas tout-à-fait cela.

    Tu peux tout-à-fait gérer le comportement du processus sur réception d'un signal individuel avec signal(), par exemple. Les fonctions sigaddset() et consors ne sont que des fonctions de gestion d'une liste de signaux. À toi ensuite de passer cette liste aux fonctions qui sont capables de l'exploiter, telles que sigprocmask().

    Comme dit plus haut, le principal intérêt d'une gestion d'ensembles de signaux est de pouvoir faire des opérations atomiques.

    sinon le processus ne peut pes connaitre le signal!! Merci encore
    Si. Les signaux sont en quelque sorte des alertes système. Ils sont tous définis à l'avance, on ne « crée » pas de niveau signal, et chacun d'un a un comportement par défaut dans chaque processus. Lorsque ton application reçoit un signal, il se peut qu'elle l'ignore, mais elle l'aura bien reçu. La plupart du temps, d'ailleurs, ce signal provoquera sa fin.

Discussions similaires

  1. explication de netsh int tcp set global
    Par hacbao dans le forum Windows
    Réponses: 0
    Dernier message: 21/03/2015, 19h09
  2. Not all named parameters have been set: [:int]
    Par franco9 dans le forum Hibernate
    Réponses: 1
    Dernier message: 11/09/2014, 19h48
  3. for(int i = 0, I = set.size(); i < I; i++) plus rapide?
    Par muad'dib dans le forum Général Java
    Réponses: 16
    Dernier message: 27/08/2010, 20h38
  4. set term ^
    Par tux dans le forum Débuter
    Réponses: 8
    Dernier message: 12/10/2004, 20h42
  5. character set // Nls_lang
    Par fopicht dans le forum Oracle
    Réponses: 2
    Dernier message: 23/05/2002, 12h04

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo