Programme serveur d'autorisation (PSR)

DjoTT -  
 Utilisateur anonyme -
Bonjour,
Je suis en train de développer un petit programme serveur d'autorisation pour l'accès des trains sur une seule voie dans deux sens (soit de la station A vers la station B et vice versa), le problème c'est que le compilateur ne reconnait pas certaine appels système tels que sem_post, sem_wait, ... voici quelques erreurs générées:

undefined reference to 'sem_wait'
undefined reference to 'sem_post'
undefined reference to 'strcomp'
undefined reference to 'pthread_create'
undefined reference to 'pthread_join'

ci-dessous le programme .C, svp, si quelqu'un peut me le corriger, merci d'avance :)

#include <stdio.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <stdlib.h>
#include <string.h>
#include <pthread.h>
#include <semaphore.h>

int NbTrainAB=0;
int NbTrainBA=0;
pthread_mutex_t MutexA,MutexB;//mutex
sem_t autorisation;//semaphore autorisation


void error(char *msg)
{
   perror(msg);
   exit(1);
}

void voyager(){
usleep(15);}

void* TrainAB(){
pthread_mutex_lock(&MutexA);
if(NbTrainAB=0)
{sem_wait(&autorisation);}
NbTrainAB++;
printf("Vous etes le train numero %d\n",NbTrainAB);
pthread_mutex_unlock(&MutexA);
voyager();
pthread_mutex_lock(&MutexA);
if(NbTrainAB=1)
{sem_post(&autorisation);}
NbTrainAB--;
pthread_mutex_unlock(&MutexA);
pthread_exit(NULL);
}


void* TrainBA(){
pthread_mutex_lock(&MutexB);
if(NbTrainBA=0)
{sem_wait(&autorisation);}
NbTrainBA++;
printf("Vous etes le train numero %d\n",NbTrainBA);
pthread_mutex_unlock(&MutexB);
voyager();
pthread_mutex_lock(&MutexB);
if(NbTrainBA=1)
{sem_post(&autorisation);}
NbTrainBA--;
pthread_mutex_unlock(&MutexB);
pthread_exit(NULL);
}

int main(int argc, char *argv[])
{
    int sockfd, newsockfd, portno, clilen;
    char buffer[256];
    struct sockaddr_in serv_addr, cli_addr;
    int n;
    pthread_mutex_init(&MutexA,NULL);
    pthread_mutex_init(&MutexB,NULL);
    sem_init(&autorisation,0,1);
    if (argc != 2) {
       fprintf(stderr,"Erreur, Manque d'argument\n");
      exit(1);  }

  sockfd = socket(AF_INET, SOCK_STREAM, 0);
  if (sockfd < 0) error("Erreur d'ouverture du socket");

  bzero((char *) &serv_addr, sizeof(serv_addr));
  portno = atoi(argv[1]);
  serv_addr.sin_family = AF_INET;
  serv_addr.sin_addr.s_addr = INADDR_ANY;
  serv_addr.sin_port = htons(portno);
  
  if (bind(sockfd, (struct sockaddr *) &serv_addr,sizeof(serv_addr)) < 0)
          error("Erreur d'association au port");
  if(listen(sockfd,5)==-1)
          error("Erreur dans listen\n");
  else
  {
  clilen = sizeof(cli_addr);
  while(1){
  newsockfd = accept(sockfd,(struct sockaddr *) &cli_addr,&clilen);
  if (newsockfd < 0)  
  {error("Erreur d'acceptation");}
  else{
  pthread_t tid;
  bzero(buffer,256);
  n = read(newsockfd,buffer,255);
  if (n < 0) error("Erreur de lecture du socket");

  if(strcomp(buffer,"A")==0){
  printf("Bon voyage de B vers A\n");
  if(pthread_create(&tid,NULL,TrainBA,NULL)==-1)
  {perror("Thread1");exit(EXIT_FAILURE);}}

  if(strcomp(buffer,"B")==0){
  printf("Bon voyage de A vers B\n");
  if(pthread_create(&tid,NULL,TrainAB,NULL)==-1)
  {perror("Thread2");exit(EXIT_FAILURE);}
   pthread_join(tid,NULL);
  }
  n = write(newsockfd,"Fin de voyage",13);
  if (n < 0) error("Erreur d'écriture dans le socket");
  exit(EXIT_SUCCESS);
  }
}
close(newsockfd);
}
}

2 réponses

Utilisateur anonyme
 
Bonjour

Tu obtiens ces erreurs à la compilation proprement dite ou à l'édition de liens ?
Je pencherais plutôt pour l'édition de liens, tu n'as pas dû fournir les bibliothèques.
0
sambia39 Messages postés 610 Date d'inscription   Statut Membre Dernière intervention   49
 
Bonjour
je n'ai pas lu tout le code car il n'est pas indenté et il préférable de le faire en utilisant les balises mises à ta disposition
<code c>
</code>

Avant de te répondre et comme c'est un projet de gestion de train , tu utilise les mutex ou sémaphore voire les deux ? car une des deux suffis de faire ce que tu veux.
quant à ton erreur de compilation il faut linker ton exécutable avec les bonnes bibliothèques
gcc app.c -Wall -lrt -lpthread -o Gestion 

-lrt 
pour les sémaphore , mémoire partagé
-lpthread 
pour les thread
à bientôt
0
Utilisateur anonyme
 
0