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 :

Pthread, signaux et system IPC vV sortie


Sujet :

Linux

  1. #1
    Membre confirmé

    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Février 2005
    Messages
    464
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Loire (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués
    Secteur : Industrie

    Informations forums :
    Inscription : Février 2005
    Messages : 464
    Points : 646
    Points
    646
    Par défaut Pthread, signaux et system IPC vV sortie
    Voilà je fais ce petit test pour trouver une fçon de sortir d'un msgrecv() avec une attente infinie.
    Avec le code suivant je peux choisir une attente ds le process ou dans le thread. A partir d'une console j'envoie le signal SIGUSR1. Résultat :
    _ process : Je sors "brutalement" de mon attente avec errno positionné..
    _ thread : Bien que SIGUSR1 soit reçu je ne sors pas de l'attente.

    Qqun saurait expliquer cela ? Merci.


    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
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
     
    #include <stdio.h>
    #include <stdlib.h>
    #include <sys/types.h>
    #include <sys/ipc.h>
    #include <sys/msg.h>
    #include <unistd.h>
    #include <errno.h>
    #include <signal.h>
    #include <string.h>
    #include <sys/stat.h>
    #include <pthread.h>
     
     
    //#define PROCESS
     
    #define MSG_PRI_NORMAL 2
    #define MSG_LENGTH 256
     
    typedef struct
    {
            long type;
            char cMsg[MSG_LENGTH];
    } MSG;
    MSG stMsg ;
     
    pthread_t thread ;
    int msgq_id = -1 ;
    int iRetCode = -1 ;
    int maxNBytes = 256 ;
     
    void handler_SIGUSR1(int) ;
    void * fn_thread(void *) ;
     
    int main (void)
    {
            /* Declaration */
            struct sigaction action ;
     
            /* Installer le gestionnaire */
            action.sa_handler = handler_SIGUSR1 ;
            sigemptyset( &(action.sa_mask) ) ;
            action.sa_flags = SA_RESTART ;
            if(sigaction(SIGUSR1, &action, NULL) != 0)
            {
                    fprintf(stderr, "Erreur %d \n", errno) ;
                    exit(EXIT_FAILURE) ;
            }
     
     
            /* Creer la MSGQ */
            msgq_id = msgget(IPC_PRIVATE, S_IRUSR | S_IWUSR) ;
            if( msgq_id == -1)
            {
                    perror("error msgqcreate") ;
                    msgq_id = 0 ;
            }
     
    #ifndef PROCESS
            /* Creer le pthread */
            if( pthread_create(&thread, NULL, fn_thread, NULL) != 0)
            {
                    perror("[main] pthread_create\n") ;
                    exit(EXIT_FAILURE) ;
            }
     
            pthread_join(thread, NULL) ;
    #else
            fn_thread(NULL) ;
    #endif
     
            return EXIT_SUCCESS ;
    }
     
     
    void handler_SIGUSR1(int arg)
    {
            fprintf(stdout, "Recu SIGUSR1\n");
    }
     
     
    void * fn_thread(void *arg)
    {
     
            /* Attendre un message*/
            iRetCode = msgrcv(msgq_id, (void *)&stMsg, maxNBytes, - MSG_PRI_NORMAL, 0) ;
            if(iRetCode == 0)
            {
                    fprintf(stdout, "[main] msgrcv success\n");
            }
            else
            {
                    switch(errno)
                    {
                            case EACCES:
                                    fprintf(stdout, "[main] mrcv error : Le processus appelant n'a pas de permission de lecture dans la file\n");
                                    break ;
                            case EINVAL:
                                    fprintf(stdout, "[main] mrcv error : msgqid ou msgsz invalides\n") ;
                                    break ;
                            case EINTR:
                                    fprintf(stdout, "[main] mrcv error : Un signal est arrivé avant d'avoir pu lire quoi que ce soit\n") ;
                                    break ;
                            default:
                                    fprintf(stdout, "[main] erreur inconnue\n") ;
                    break ;
                    }
            }
    #ifndef PROCESS
            pthread_exit(NULL) ;
    #endif
    }

  2. #2
    Membre confirmé

    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Février 2005
    Messages
    464
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Loire (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués
    Secteur : Industrie

    Informations forums :
    Inscription : Février 2005
    Messages : 464
    Points : 646
    Points
    646
    Par défaut
    mmm ... G cherché et je pense qu'un pthread_kill() résoudrait le problème.

    Par Ailleurs, y'a-t-il un - Bon - forum qui se concentre sur le développement Linux et non pas l'installation de distribution, la conenxion d'un lecteur SUB ou l'écriture de shell ??
    Merci.

Discussions similaires

  1. Réponses: 1
    Dernier message: 23/10/2014, 08h20
  2. Programmation systeme en C et les signaux
    Par Traboulidon dans le forum Réseau
    Réponses: 27
    Dernier message: 06/02/2007, 10h32
  3. system et redirection sortie standard sous linux
    Par Choupinou dans le forum Linux
    Réponses: 14
    Dernier message: 11/01/2007, 23h25
  4. PB sortie standard avec les PTHREAD !!!
    Par djspit dans le forum C++
    Réponses: 15
    Dernier message: 19/11/2004, 01h17

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