Contenu | Rechercher | Menus

Annonce

Si vous avez des soucis pour rester connecté, déconnectez-vous puis reconnectez-vous depuis ce lien en cochant la case
Me connecter automatiquement lors de mes prochaines visites.

À propos de l'équipe du forum.

#1 Le 28/05/2007, à 16:30

Damiens

Programmation modulaire et threads.

j'ai un probleme de compilation au moment ou je veux linker tous mes fichiers .o.

Voici les codes :

fichier creationPartie.c

#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include "creationPartie.h"
#include "itoa.h"

#define FALSE 0
#define TRUE !FALSE
#define MAX_CHAR 15
#define BASE10 10

int creationPartieFork(void){
  int fd;
  char cont[MAX_CHAR];

  //ouverture de la fifo
  if (fd=open("cpcs",O_NONBLOCK) == -1){
    perror("ouverture FIFO cpcs :");
    return FALSE;
  }
  //lecture de la fifo
  if (read(fd,cont,MAX_CHAR) == -1){
    perror("Lecture FIFO cpcs :");
    return FALSE;
  }
  //fermeture de la fifo
  if (close(fd) == -1){
    perror("fermeture FIFO cpcs :");
    return FALSE;
  }
  //si bon return TRUE
  return TRUE;
}

int creationPartieAck(int arg){
  int verif;
  int fd;
  
  //ouverture de la fifo
  if (fd=open("cpsc",O_NONBLOCK) == -1){
    perror("ouverture FIFO cpsc :");
    return FALSE;
  }
  //ecriture de arg dans la fifo
  verif=write(fd,itoa(arg,BASE10),MAX_CHAR);
  if ((verif == 0) || (verif == -1)){
    perror("ecriture FIFO cpsc :");
    return FALSE;
  }
  //fermeture de la fifo
  if (close(fd) == -1){
    perror("fermeture FIFO cpsc :");
    return FALSE;
  }
  return TRUE;
}

void *creationPartie (void *ptr){
  pid_t pid;
  while(TRUE){
    if (creationPartieFork()){
      //fork
      pid = fork();
      switch (pid){
        case -1 :
	  printf("fork a engendre une erreur.");
	  perror("fork :");
	  break;
        case 0 :
	  //On est dans l'enfant donc exec pour remplacer l'enfant par le code du fils
	  if (execl("./fils",NULL) == -1){
	    perror("exec :");
	  }
	  break;
        default :
	  //On est dans le parent. Le pid du fils est passe en argument a creationPartieAck
	  creationPartieAck(pid);
	  break;
      } 
    }
  }                      
}

je fais gcc -c creationPartie.c et j'obtiens creationPartie.o donc tout va bien.

fichier itoa.c :

#include <stdio.h>
#include <stdlib.h>

char* itoa(int val, int base){
  static char buf[32] = {0};
  int i = 30;

  for(; val && i ; --i, val /= base)
   buf[i] = "0123456789abcdef"[val % base];

  return &buf[i+1];	
}

meme remarque que precedemment mais le nom de fichier change. De plus, j'ai recupere ce code sur internet mais tout le reste est de moi.

fichier main.c :

#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
//#include <unistd.h>
#include <pthread.h>
#include "creationPartie.h"
//#include "itoa.h"

int main(int argc, char** argv){
  pthread_t creaPartie;

  //creation des fifos
  if ((mkfifo("cpcs",O_RDWR)) != 0){
    printf("<serveur>creation FIFO cpcs");
  }
  if ((mkfifo("cpsc",O_RDWR)) != 0){
    printf("<serveur>creation FIFO cpsc");
  }
  //creation des threads
  pthread_create(&creaPartie,NULL,(void*)&creationPartie,(void*)"creation partie");

  //les pthread_join
  pthread_join(creaPartie,NULL);
}

a nouveau j'obtiens le .o

et voici les headers :

itoa.h :

#ifndef ITOA_H
#define ITOA_H

char* itoa(int val, int base);

#endif

creationPartie.h

#ifndef CREATIONPARTIE_H
#define CREATIONPARTIE_H

int creationPartieFork(void);

int creationPartieAck(int arg);

void *creationPartie (void *ptr);

#endif

Le probleme se passe lorsque je tape la commande suivante : gcc main.o creationPartie.o itoa.o

l'erreur est la suivante :

main.c: (.text+0X78): undefined reference to 'pthread_create'
main.c: (.text+0X8b): undefined reference to 'pthread_join'

ce que je ne comprends pas c'est que j'ai inclu <pthread.h> donc il devrait connaitre ces fonctions ... j'ai essaye en rajoutant <unistd.h> et "itoa.h"(d'ou les commentaires ...). En effet j'avais deja eu un erreur de ce type avec O_RDWR lorsque je cree les fifos dans le main et j'avais du rajouter <fcntl.h> alors qu'il est absent de la man de mkfifo ... Donc, voila ! Je suis perdu. Pourriez-vous m'aider svp ?

#2 Le 28/05/2007, à 18:20

Marabout

Re : Programmation modulaire et threads.

Salut,

il faut que tu linkes avec la librairie pthread :

gcc main.o creationPartie.o itoa.o -lpthread

Hors ligne

#3 Le 28/05/2007, à 19:28

damiens

Re : Programmation modulaire et threads.

j'ai le message suivant : cannot find lpthread.

j'ai lu sur d'autres forums que c'etait probablement un probleme de librairie manquante mais je ne sais pas laquelle je dois installer ...:/

Mais ca a l'air d'etre bien parti big_smile

#4 Le 28/05/2007, à 19:32

Damiens

Re : Programmation modulaire et threads.

j'ai bien trouve ca : http://www.oesf.org/forums/index.php?showtopic=4529 mais je ne sais pas comment je dois verifier si elle est presente et encore moins ce que je dois faire pour appliquer la solution donnee ...

#5 Le 28/05/2007, à 19:54

Watchwolf

Re : Programmation modulaire et threads.

ty regarde dans synaptic.

Hors ligne

#6 Le 28/05/2007, à 20:07

damiens

Re : Programmation modulaire et threads.

j'ai fait une recherche sur lpthread dans synaptic et je n'ai aucun paquet correspondant a cette recherche. Desole mais je suis nouveau sur linux donc je ne m'en sors pas tres bien ... Personne ne sait quel est le paquet que je dois installer ?

#7 Le 28/05/2007, à 20:55

Link31

Re : Programmation modulaire et threads.

libpthread-dev

Hors ligne

#8 Le 28/05/2007, à 23:25

damiens

Re : Programmation modulaire et threads.

Merci a tous ! tout fonctionne parfaitement !!! big_smile