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

POSIX C Discussion :

[SIGNAL] threads et processus


Sujet :

POSIX C

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Décembre 2003
    Messages
    71
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Décembre 2003
    Messages : 71
    Points : 59
    Points
    59
    Par défaut [SIGNAL] threads et processus
    Salut,

    j'ai une question concernant les signaux dans les threads et fork. Je cherche en fait a voir qu'est ce qui est hérité et qu'est ce qui ne l'est pas. Je fais en fait
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    signal(SIGINT, myfunc);
    dans mon processus pere. Mon processus pere fork d'abord plusieurs fois pui s crée 2 threads. J'ai donc un certain nombre de fils et 2 threads. Je cherche lorsque je fais ctrl-c a quitter proprement cad a vider mes sémaphores. Le probleme est qu'en définissant comme ca et dans mon pere seuls les processus fils captent le signal et lance myfunc. Mais il y a donc x tentatives de suppression de sémaphores => ca foire !

    Ce que je voudrais c'est juste effacer une seule fois mes sémaphores. J'ai donc pensé à capter le signal ctrl-c dans un seul thread du pere mais il capte rien du tout.

    Comment faire???

    merci de vos éclaircissements

  2. #2
    Membre éprouvé
    Avatar de Pouic
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    669
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Octobre 2004
    Messages : 669
    Points : 977
    Points
    977
    Par défaut
    Salut,

    La, comme ca, je dirais que l'utilisation d'une variable globale serait une bonne solution (si on ne veut pas se compliquer la vie )

    en global:
    et dans ton handler de signaux:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    void sighandler(int s){
    ....
        if ( !check){
           /* on arrive ici pour la premiere fois: on supprime ce qu'il y a à supprimer */
           check = 1;  
        }
    .....
    }
    => il faut proteger la portion de code avec le test par des semaphores si plusieurs processus sont susceptibles d'acceder a ce handler en même temps...

    ++
    Pouic
    Software becomes slower faster than hardware becomes faster
    [size=1]
    http://xrenault.developpez.com

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Décembre 2003
    Messages
    71
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Décembre 2003
    Messages : 71
    Points : 59
    Points
    59
    Par défaut
    J'ai plusieurs remarques :

    la premiere est que jpeux me tromper mais l'handler est pour définir les SIGUSR nan ?
    La seconde est que tout mon probleme est que c'est obligé le pere qui doit faire le nettoyage. Donc je sais pas comment les threads vont entre eux se répartir le captage du signal. si je fais
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    signal(SIGINT, myfunc)
    avant de faire mes threads j'aurai le signal définit pour tous mes threads. Donc logiquement 3 appels de myfunc duquel je ne dois faire qu'une fois la routine de nettoyage. Ce que j'avais fait a l'origine c'est de laisser mes fils mourir avec le ctrl-c mais capter le signal dans 1 seul des threads... mais évidement ca fonctionne pas il capte rien du tout...

  4. #4
    Membre éprouvé
    Avatar de Pouic
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    669
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Octobre 2004
    Messages : 669
    Points : 977
    Points
    977
    Par défaut
    Citation Envoyé par beLz
    J'ai plusieurs remarques :

    la premiere est que jpeux me tromper mais l'handler est pour définir les SIGUSR nan ?
    Non. Tu peux redefinir le traitement de presque tous les signaux (sauf deux, mais je ne m'en rapelle jamais).

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    signal(SIGINT, myfunc)
    il me semble que l'utilisation de la fonction signal est desuet: il faut utiliser a la place sigaction (mais bon, ce n'est pas très important dans le contexte)

    et enfin, je ne comprend pas ce qui te pose probleme dans ma solution ?

    ++
    Pouic
    Software becomes slower faster than hardware becomes faster
    [size=1]
    http://xrenault.developpez.com

  5. #5
    Membre du Club
    Profil pro
    Inscrit en
    Décembre 2003
    Messages
    71
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Décembre 2003
    Messages : 71
    Points : 59
    Points
    59
    Par défaut
    mon probleme est que seul mes fils répondent au signal que je catche. Le pere n'a pas l'air de s'en soucier. Alors que je voudrai que ce soit le pere qui attrape le signal.

    Je vais continuer a chercher je continuerai de t'ennuyer si ca fonctionne pas

    merci quand meme :p

  6. #6
    Membre éprouvé
    Avatar de Pouic
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    669
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Octobre 2004
    Messages : 669
    Points : 977
    Points
    977
    Par défaut
    Citation Envoyé par beLz
    mon probleme est que seul mes fils répondent au signal que je catche. Le pere n'a pas l'air de s'en soucier. Alors que je voudrai que ce soit le pere qui attrape le signal.
    Tiens.... Ce n'est pas normal, ça.... Tu peux montrer ton code s'il n'est pas trop long ? (ou l'uploader sur un ftp sinon)

    Et quant à m'ennuyer, il n'y a pas de problemes: j'espere que tu trouvera rapidemment ta reponse !

    ++
    Pouic
    Software becomes slower faster than hardware becomes faster
    [size=1]
    http://xrenault.developpez.com

  7. #7
    Membre du Club
    Profil pro
    Inscrit en
    Décembre 2003
    Messages
    71
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Décembre 2003
    Messages : 71
    Points : 59
    Points
    59
    Par défaut
    bon jte poste en gros un code raccourcis :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
     
    int main(int argc, char *argv) {
     
    // Un tas d'opérations
     
    for &#40;i=0; i < max; i++&#41; &#123;
    PIDS&#91;i&#93;=fork&#40;&#41;;
    if &#40;PIDS&#91;i&#93;==0&#41; &#123; break; &#125;
    &#125;
     
    if &#40;PIDS&#91;current&#93; == 0&#41; &#123;
    // on est dans un fils
    startFils&#40;current&#41;;
    &#125;
    else &#123;
    signal&#40;SIGINT, cleanAll&#41;;
    if &#40;pthead_create&#40;&mythread1, NULL, funmythread1, NULL&#41;  < 0&#41; &#123;
    cleanAll&#40;&#41;;
    &#125;
    if &#40;pthead_create&#40;&mythread2, NULL, funmythread2, NULL&#41;  < 0&#41; &#123;
    cleanAll&#40;&#41;;
    &#125;
    // création de shmem
     
    while&#40;TRUE&#41; &#123;
    downmutex&#40;mymutex&#41;;
    //ops
    &#125;
    &#125;
    &#125;
    void cleanAll&#40;&#41; &#123;
    // enlever les semaphores et les sh mem
    exit&#40;EXIT_SUCCESS&#41;;
    &#125;
     
    void *funmythread1&#40;&#41; &#123;
    signal&#40;SIGINT, NULL&#41;;
    // ops
    &#125;
    void *funmythread2&#40;&#41; &#123;
    signal&#40;SIGINT, NULL&#41;;
    // ops
    &#125;
    Voila j'espere que c'est plus clair comme ca

    merci bcp de ton aide

  8. #8
    Membre éprouvé
    Avatar de Pouic
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    669
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Octobre 2004
    Messages : 669
    Points : 977
    Points
    977
    Par défaut
    hmmm, etrange....
    Deja, moi, je sortirais ceci des fonctions associees aux thread: ce n'est pas necessaire.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    signal&#40;SIGINT, cleanAll&#41;;
    J ai fais un test rapidemment sur un programme semblable au tiens (au niveau de la structure), et pour moi, , il n'y a que le pere qui capte le signal...
    Je dois t'avouer que je ne vois pas trop ce qui se passe....
    Si c'est trop long pour que ce soit lisible sur le forum, tu peux m'envoyer ton code complet par mp (si tu ne peux pas l'uploader)?
    Software becomes slower faster than hardware becomes faster
    [size=1]
    http://xrenault.developpez.com

  9. #9
    Membre du Club
    Profil pro
    Inscrit en
    Décembre 2003
    Messages
    71
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Décembre 2003
    Messages : 71
    Points : 59
    Points
    59
    Par défaut
    je t'ai envoyé ca en mp.

    merci de ton aide

  10. #10
    Expert éminent sénior
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut
    Citation Envoyé par Pouic
    La, comme ca, je dirais que l'utilisation d'une variable globale serait une bonne solution (si on ne veut pas se compliquer la vie )

    en global:
    En toute rigueur:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    sig_atomic_t check = 0;
    Ce type est défini dans <signal.h>
    Pas de Wi-Fi à la maison : CPL

  11. #11
    Membre du Club
    Profil pro
    Inscrit en
    Décembre 2003
    Messages
    71
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Décembre 2003
    Messages : 71
    Points : 59
    Points
    59
    Par défaut
    euuuuh oui

    le sig_atomic_t n'est pas un typedef int ?

    si oui alors qu'est ce que ca change ?
    Juste pour la beauté d'utiliser les bons types ?

  12. #12
    Expert éminent sénior
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut
    Citation Envoyé par beLz
    le sig_atomic_t n'est pas un typedef int ?
    Sur ton implémentation, peut être...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    d&#58;\Program Files\Microsoft Visual Studio\VC98\Include\SIGNAL.H&#40;59&#41;&#58; typedef int sig_atomic_t;
    d&#58;\Program Files\Microsoft Visual Studio\VC98\CRT\SRC\SIGNAL.H&#40;73&#41;&#58; typedef int sig_atomic_t;
    d&#58;\BC\INCLUDE\SIGNAL.H&#40;16&#41;&#58; typedef int sig_atomic_t;   /* Atomic entity type &#40;ANSI&#41; */
    d&#58;\BCC55\INCLUDE\SIGNAL.H&#40;49&#41;&#58; typedef int sig_atomic_t;   /* Atomic entity type &#40;ANSI&#41; */
    d&#58;\DJGPP.NEW\include\signal.h&#40;31&#41;&#58; typedef int sig_atomic_t;
    d&#58;\TC\INCLUDE\SIGNAL.H&#40;19&#41;&#58; typedef int	sig_atomic_t; 	/* Atomic entity type &#40;ANSI&#41; */
    d&#58;\Djgpp_\include\signal.h&#40;31&#41;&#58; typedef int sig_atomic_t;
    d&#58;\Djgpp_\rsxntdj\include\sys\signal.h&#40;10&#41;&#58; typedef int sig_atomic_t;
    si oui alors qu'est ce que ca change ?
    Juste pour la beauté d'utiliser les bons types ?
    A écrire du code portable.
    Pas de Wi-Fi à la maison : CPL

  13. #13
    Membre éprouvé
    Avatar de Pouic
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    669
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Octobre 2004
    Messages : 669
    Points : 977
    Points
    977
    Par défaut
    Citation Envoyé par Emmanuel Delahaye
    En toute rigueur:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    sig_atomic_t check = 0;
    Ce type est défini dans <signal.h>
    Arf, oui, en plus tu me l'as déja dis... desolé...

    @beLz:
    effectivement, tu ne pouvais pas le poster ici
    Comme je n'avais pas les .h pour tester tout ca...
    Mais je pense que ton probleme vient du fait que tu n'utilises pas les bonnes fonctions de signaux:
    Ce que tu devrais faire (a mon avis):
    Dans le pere (au tout debut):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    struct sigaction action;
    sigemptyset&#40;&action.sa_mask&#41;;
    action.sa_flags = 0;
    action.sa_handler = exitCleanly;
    sigaction &#40;SIGINT, &action, NULL&#41;; /* on redefinit le traitement */
    Dans les fils:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    sigset_t mask;
    sigaddset&#40;&mask, SIGINT&#41;;
    sigprocmask&#40;SIG_SETMASK, &mask, NULL&#41;; /* les fils ne voient plus SIGINT */
    et dans les threads:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    sigset_t mask_thread;
    sigaddset&#40;&mask_thread, SIGINT&#41;;
    pthread_sigmask&#40;SIG_SETMASK, &mask_thread, NULL&#41;; /* les thread non plus ! */
    Avec ca, si quelqu'un d'autre que le pere capte le signal SIGINT, je ne comprends vraiment plus rien .....
    Software becomes slower faster than hardware becomes faster
    [size=1]
    http://xrenault.developpez.com

  14. #14
    Membre du Club
    Profil pro
    Inscrit en
    Décembre 2003
    Messages
    71
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Décembre 2003
    Messages : 71
    Points : 59
    Points
    59
    Par défaut
    ben voila ca fonctionne nickel

    visiblement l'appel de sigaction, sigmask et tout et tout est bcp plus fiable que signal()...

    Un énorme merci a toi

    ps : quand un probleme disparait, un autre surgit ^^ mais jsuis pas sur qu'il attendra pas demain.. on verra
    ps2 : simple précision t'as juste fait une erreur de frappe au sigsmask jdis ca si qq cherchait a utiliser le code

  15. #15
    Membre éprouvé
    Avatar de Pouic
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    669
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Octobre 2004
    Messages : 669
    Points : 977
    Points
    977
    Par défaut
    hop, édité !
    Sinon, la fonction signal peut sembler bien pratique parcequ'il y a moins de parametres a mettre en place, mais elle est deprecated (enfin il me semble)
    Je recommande l'utilisation de la fonction sigaction a la place (ainsi que les fonctions associées: sigfillset, sigaddset, sigprocmask, sigismember, etc....)

    En tout cas, content que ton probleme soit résolu

    ++
    Pouic
    Software becomes slower faster than hardware becomes faster
    [size=1]
    http://xrenault.developpez.com

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Thread et processus
    Par 3DArchi dans le forum C#
    Réponses: 3
    Dernier message: 16/07/2009, 15h10
  2. Boost signal thread safe?
    Par epsilon68 dans le forum Boost
    Réponses: 13
    Dernier message: 04/02/2008, 18h20
  3. service, thread et processus
    Par rdh123 dans le forum Windows
    Réponses: 9
    Dernier message: 02/01/2008, 17h37
  4. Les threads des processus
    Par el_filosof dans le forum Windows Forms
    Réponses: 3
    Dernier message: 18/09/2007, 00h03

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