#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
#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 !!!