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

 C Discussion :

probleme avec signal


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre actif
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2013
    Messages
    84
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Février 2013
    Messages : 84
    Par défaut probleme avec signal
    Bonjour,

    Le code suivant permet d'envoyer les indice des cases de toutes la colonne d'une matrice a chaque incrementation de l'indice de ligne (sync).
    Le programme fonctionnait bien en utilisant un sleep (deux lignes en commentaire) qui rend l'incrementation de l'indice de ligne periodique de periode PTU.
    Mais lorsque j'ai essayé d'employer un signal temps reel pour cette tache ça donne une erreur que je n'arrive a contourner. En fait j'ai essayé plusieurs prototype pour sync admin mais en vain !!

    voila le code
    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
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    #define _GNU_SOURCE
    #include <pthread.h>
    #include <stdio.h>
    #include <sched.h>
    #include <stdlib.h>
    #include <string.h>
    #include <signal.h>
    #include <unistd.h>
    #include <sys/time.h>
    #define NBR_CYCLE 5
    #define NBR_TRAME 16
    #define PTU 2000            // 2ms
    #define HIGHEST_PRIORITY 99
    ////////////////////////////////////////////////////////////////////
    typedef struct signaux_thread
    {
     
       int sync ;
       char *(*schedule_table)[NBR_TRAME];
     
    }signaux_thread;
     
    //////////////////// THREAD GESTIONNAIRE
      void *sync_sig(void *arg)
      {
        struct signaux_thread * signal_ptu= (struct signaux_thread *)arg;
        signal_ptu->sync++;
      }
    //////////////////FONCTION DU THREAD
     
    void *func_thread (void *arg)
    {
      int j;
      struct signaux_thread * signal= (struct signaux_thread *)arg;
      fprintf(stderr,"sync frame number: %d\n ",signal->sync);
     
      for (j=0;j<NBR_TRAME;j++)
    	    {
    	      fprintf(stderr,"la trame %s est envoyée\n",signal->schedule_table[signal->sync][j]);	   
    	    }
      }
    ///////////////////////////    MAIN
    int main(void)
    {
      int i,j;
      int err;
      pid_t pid;
      pthread_attr_t attr;
      struct sched_param param_processus;
      struct sched_param param_thread ;
      pthread_t thread;
      char *ScheduleTable[NBR_CYCLE][NBR_TRAME];
      struct signaux_thread arg;
      struct timeval elapsed_time ;
      struct timeval chrono;
      int priority ;
      struct sigevent ptu_event;
      struct itimerspec ptu_period;
      timer_t ptu_timer;
    ///////initialisation du elapsed time
     gettimeofday(&elapsed_time,NULL);
     chrono=elapsed_time;
     fprintf(stdout,"elapsed time= %d \n",elapsed_time.tv_usec-chrono.tv_usec);
     
    ////////////////     AFFECTATION PRIORITE TEMPS REEL FIFO
      param_processus.sched_priority = HIGHEST_PRIORITY;
      if (sched_setscheduler(0, SCHED_FIFO, &param_processus) != 0)
        {
        perror("sched_setscheduler");
         exit(EXIT_FAILURE);
         }
    /////////////////     AFFECTATION PRIORITE THREAD
      pthread_attr_init(&attr);
     
      if ((err=pthread_attr_setschedpolicy(&attr,SCHED_FIFO))!=0)
        {
          fprintf(stderr,"setschedpolicy: %s\n",strerror(err));
          exit(EXIT_FAILURE);
        }
     if ((err=pthread_attr_setinheritsched(&attr,PTHREAD_EXPLICIT_SCHED))!=0)
        {
          fprintf(stderr,"setinheritshed: %s\n",strerror(err));
          exit(EXIT_FAILURE);
        }
     
     param_thread.sched_priority=HIGHEST_PRIORITY;
     
     if ((err=pthread_attr_setschedparam(&attr,&param_thread))!=0)
        {
          fprintf(stderr,"setschedparam: %s\n",strerror(err));
          exit(EXIT_FAILURE);
        }
     /////////////////////////////////////////////////////
      arg.sync = 0;
      arg.schedule_table = ScheduleTable;
      priority=sched_getscheduler(0);
      switch (priority)
        {  
        case SCHED_FIFO :
    	fprintf(stdout,"FIFO PRIORITY IS : %d \n",param_processus.sched_priority);
    	break;
        case SCHED_RR :
    	fprintf(stdout,"ROUND ROBIN PRIORITY IS : %d \n",param_processus.sched_priority);
    	break;
        default:
          fprintf(stdout,"OTHER PRIORITY USED \n");
        break;
        } 
      ////////////         REMPLISSAGE SCHEDULE TABLE
      for ( i=0;i<NBR_CYCLE;i++)
        {
          for ( j=0;j<NBR_TRAME;j++)
    	{
    	  ScheduleTable[i][j]=(char*)malloc(3 * sizeof(char));
    	  sprintf(ScheduleTable[i][j],"%d.%d",i,j);
    	}
        }
      /////////////////////   CREER UN SIGNAL
     
      signal(SIGRTMIN,sync_sig);
      ptu_event.sigev_notify=SIGEV_SIGNAL;
      ptu_event.sigev_signo=SIGRTMIN;
      if(timer_create(CLOCK_REALTIME,&ptu_event,&ptu_timer)!=0)
        {
          perror("timer_create");
          exit(EXIT_FAILURE);
        }
      PTU*=1000;
      ptu_period.it_value.tv_sec=PTU/1000000000;
      ptu_period.it_value.tv_nsec=PTU%1000000000;
      ptu_period.it_interval=ptu_period.it_value;
      if(timer_settime(ptu_timer,0,&ptu_period,NULL)!=0)
        {
          perror("timer_settime");
          exit(EXIT_FAILURE);
     
        }
     
      /////////////////////   EXECUTION DU THREAD
      while(1)
        {
          if((err=pthread_create(&thread,&attr,func_thread,&arg)!=0))
    	{
    	  fprintf(stderr,"can't create thread %s \n",strerror(err));
    	  exit(EXIT_FAILURE);
    	}
          chrono=elapsed_time;
          gettimeofday(&elapsed_time,NULL);
          fprintf(stdout,"elapsed time= %d \n",((elapsed_time.tv_usec-chrono.tv_usec)/1000));
          // usleep(PTU);
          // arg.sync++;
          if (arg.sync==NBR_CYCLE)
    	 {arg.sync=0;}
          pause();
          return EXIT_SUCCESS;
        }
     
    }
    erreur :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    [makavelli@fibonacci ~]$ gcc -lrt -pthread -o thgest2 mygest2.c
    mygest2.c: In function ‘main’:
    mygest2.c:120:3: attention : passing argument 2 of ‘signal’ from incompatible pointer type [enabled by default]
    /usr/include/signal.h:101:23: note: expected ‘__sighandler_t’ but argument is of type ‘void * (*)(void *)’
    mygest2.c:128:6: erreur: lvalue required as left operand of assignment
    [makavelli@fibonacci ~]$

  2. #2
    Membre Expert
    Avatar de Metalman
    Homme Profil pro
    Enseignant-Chercheur
    Inscrit en
    Juin 2005
    Messages
    1 049
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Enseignant-Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 1 049
    Par défaut
    Tu ne peux pas mettre de type "void"...

    Si tu déclares une fonction ainsi :
    Le compilo interdira tout passage de paramètre.

    A mon avis tu essayes de faire ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    void sync_sig(void *arg)
    Et attention : sur PC... à moins d'avoir des kernels spéciaux... le VRAI "temps réel" n'existe pas...
    --
    Metalman !

    Attendez 5 mins après mes posts... les EDIT vont vite avec moi...
    Les flags de la vie : gcc -W -Wall -Werror -ansi -pedantic mes_sources.c
    gcc -Wall -Wextra -Werror -std=c99 -pedantic mes_sources.c
    (ANSI retire quelques fonctions comme strdup...)
    L'outil de la vie : valgrind --show-reachable=yes --leak-check=full ./mon_programme
    Et s'assurer que la logique est bonne "aussi" !

    Ma page Developpez.net

  3. #3
    Membre actif
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2013
    Messages
    84
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Février 2013
    Messages : 84
    Par défaut
    J'ai essayé plusieurs prototype...regarde ce qu'a donné un nouvel prototype

  4. #4
    Membre Expert
    Avatar de Metalman
    Homme Profil pro
    Enseignant-Chercheur
    Inscrit en
    Juin 2005
    Messages
    1 049
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Enseignant-Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 1 049
    Par défaut
    C'est vrai... je me suis posé du côté de la fonction que tu as écrit d'abord...

    Relis le man : Lien

    La fonction mise en argument à SIGNAL n'est pas obligée de renvoyer quelque chose (void *), mais elle doit ABSOLUMENT prendre en paramètre un int qui sera le numéro du signal reçu.

    Attention ! Une fois un signal reçu, tu dois refaire l'appel à signal() pour remettre ton handler dessus.
    --
    Metalman !

    Attendez 5 mins après mes posts... les EDIT vont vite avec moi...
    Les flags de la vie : gcc -W -Wall -Werror -ansi -pedantic mes_sources.c
    gcc -Wall -Wextra -Werror -std=c99 -pedantic mes_sources.c
    (ANSI retire quelques fonctions comme strdup...)
    L'outil de la vie : valgrind --show-reachable=yes --leak-check=full ./mon_programme
    Et s'assurer que la logique est bonne "aussi" !

    Ma page Developpez.net

  5. #5
    Membre actif
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2013
    Messages
    84
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Février 2013
    Messages : 84
    Par défaut
    alors qu'est ce que je dois faire si je ne veux pas passer un int comme argument mais plutot une structure ???

  6. #6
    Membre Expert
    Avatar de Metalman
    Homme Profil pro
    Enseignant-Chercheur
    Inscrit en
    Juin 2005
    Messages
    1 049
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Enseignant-Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 1 049
    Par défaut
    Tu devrais essayer de mettre plusieurs arguments dont le 1er sera un int et le 2e ta structure (à tester).
    Et tu devras TOUJOURS envoyer le numéro du signal en 1er argument (sinon à quoi sert un sig_handler si tu ne lui donnes pas le signal reçu ?).

    Ou mettre ta structure en global, mais il y aura des problèmes avec tes threads si tu ne lockes/sémaphores pas.
    --
    Metalman !

    Attendez 5 mins après mes posts... les EDIT vont vite avec moi...
    Les flags de la vie : gcc -W -Wall -Werror -ansi -pedantic mes_sources.c
    gcc -Wall -Wextra -Werror -std=c99 -pedantic mes_sources.c
    (ANSI retire quelques fonctions comme strdup...)
    L'outil de la vie : valgrind --show-reachable=yes --leak-check=full ./mon_programme
    Et s'assurer que la logique est bonne "aussi" !

    Ma page Developpez.net

Discussions similaires

  1. probleme avec signal et pthread
    Par Nymar dans le forum C
    Réponses: 3
    Dernier message: 09/05/2013, 14h56
  2. Probleme avec la copie des surfaces
    Par Black_Daimond dans le forum DirectX
    Réponses: 3
    Dernier message: 09/01/2003, 10h33
  3. probleme avec la touche F10
    Par b.grellee dans le forum Langage
    Réponses: 2
    Dernier message: 15/09/2002, 22h04
  4. Probleme avec fseek
    Par Bjorn dans le forum C
    Réponses: 5
    Dernier message: 04/08/2002, 07h17
  5. [Kylix] probleme avec un imagelist
    Par NicoLinux dans le forum EDI
    Réponses: 4
    Dernier message: 08/06/2002, 23h06

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