Programme serveur d'autorisation (PSR)

Fermé
DjoTT - Modifié par Whismeril le 27/12/2014 à 10:52
 Utilisateur anonyme - 27 déc. 2014 à 10:53
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);
}
}
A voir également:

2 réponses

Utilisateur anonyme
5 juin 2014 à 11:19
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 vendredi 31 juillet 2009 Statut Membre Dernière intervention 9 février 2023 49
Modifié par sambia39 le 5/06/2014 à 11:37
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
27 déc. 2014 à 10:53
0