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 06/03/2007, à 21:16

LaFouine1986

[RESOLU] C fonction thread non reconnue

Bonjour à toutes et tous,

voilà, je fais un tp de programmation système dasn le cadre de mon cursus scolaire et, en bon élève tongue, j'ai voulu le finir chez moi. Mais voilà, alors qu'il fonctionnait presque à la fac, il ne veut pas du tout tourner sous ma machine ! J'ai une erreur de segmentation au niveau de l'appel de fonction pthread_create(). Malheureusement, et je pense que c'est lié, lorsque que je fais un man pthread_create, il me sort qu'il n'a aucune entrée...

J'ai cherché d'éventuels paquets à installer, mais je n'ai rien trouvé...

Merci de votre aide ,

Dernière modification par LaFouine1986 (Le 07/03/2007, à 23:02)

Hors ligne

#2 Le 06/03/2007, à 22:15

Gari

Re : [RESOLU] C fonction thread non reconnue

heu... Il nous manque des infos là.
Par exemple : la ligne de compilation que tu utilises et le message d'erreur exact qu'il te sort.
A noter : les pages de documentation "man" sont totalement indépendantes des bibliothèques présentes (tu peux avoir l'un sans l'autre).

Hors ligne

#3 Le 06/03/2007, à 23:42

LaFouine1986

Re : [RESOLU] C fonction thread non reconnue

alors message d'erreur :
Erreur de segmentation (core dumped)
ma ligne de compilation
gcc -Wall -o tp3 -g -D_REENTRANT -D_GNU_SOURCE tp3.c -lpthread

voili, merci de l'aide !

Hors ligne

#4 Le 06/03/2007, à 23:46

Freddy

Re : [RESOLU] C fonction thread non reconnue

Pour avoir les pages de man des bibliothèques de développement, il faut installer manpages-dev (et tant qu'on y est, manpages-fr-dev, qui est une dépendance de manpages-fr).


There is no system but GNU, and Linux is one of its kernels.

Hors ligne

#5 Le 06/03/2007, à 23:49

Jonny_the_dog

Re : [RESOLU] C fonction thread non reconnue

On peut voir le code aussi ?

Hors ligne

#6 Le 06/03/2007, à 23:56

LaFouine1986

Re : [RESOLU] C fonction thread non reconnue

merci pour toutes ces précisions concernant le man, je précise que je débute sous Linux... Alors j'ai installé les paquets manpages-dev et manpages-fr mais il n'y a toujours aucune entrée concernant pthread...

Merci pour votre aide !

Hors ligne

#7 Le 06/03/2007, à 23:58

LaFouine1986

Re : [RESOLU] C fonction thread non reconnue

#include <sys/wait.h>
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <pthread.h>

//variables globales
pthread_mutex_t verrouFTE;
pthread_mutex_t verrouETF;
int nbVoitureETF;
int nbVoitureFTE;

int main(){
	printf("debut du main \n");
	int N=4;
	// initialisation, necessaire pour pouvoir utiliser le verrou
        pthread_mutex_init(&verrouFTE, NULL);
	pthread_mutex_init(&verrouETF, NULL);
	int code[N];
	int code2;
	int i;
	pthread_t tid[N];
	char* FTE = "FTE";
	char* ETF = "ETF";
	nbVoitureFTE = 0;
	nbVoitureETF = 0;
	printf("avant creation thread \n");
	code[0] = pthread_create(&tid[i], NULL, traverseTunnel, (void*) ETF);
	code[1] = pthread_create(&tid[i], NULL, traverseTunnel, (void*) ETF);
	code[2] = pthread_create(&tid[i], NULL, traverseTunnel, (void*) FTE);
	code[3] = pthread_create(&tid[i], NULL, traverseTunnel, (void*) FTE);
	printf("apres creation thread \n");
	for(i= 0; i < N; i++)
	{	printf("on attend le %d thread \n", i+1);
		code2= pthread_join(tid[i], NULL);
		printf("le %d thread a fini\n", i+1);
	}
	// destruction du verrou / libération des ressources utilisées
        pthread_mutex_destroy(&verrouFTE);
	pthread_mutex_destroy(&verrouETF);

	return 0;
}

voili pour le code du main, c'est le premier appel de la fonction pthread_create() qui fait tout planter...

Sinon, problème résolu pour le man, les fonctions sont enfin reconnues et en francais ! Merci pour l'aide ! Et un de moins !

Dernière modification par LaFouine1986 (Le 07/03/2007, à 00:07)

Hors ligne

#8 Le 07/03/2007, à 00:42

Gari

Re : [RESOLU] C fonction thread non reconnue

Tout d'abord, je ne vois pas très bien pourquoi tu parles de C++ (dans le titre) alors qu'il s'agit de C pur.
Ensuite, ton code ne compile même pas : l'objet "traverseTunnel" n'est pas défini (erreur de compilation).
L'instruction char* FTE = "FTE", bien que valide d'un point de vue de la compilation, est à mon sens une hérésie. En effet, tu mets dans FTE l'adresse d'une chaine de caractère créée temporairement. Une fois l'instruction passée, on ne sait pas trop ce qui est contenu à l'adresse pointée par FTE.
A AUCUN moment tu n'initialises la variable i. Si bien que, lorsque tu fais l'appel à la fonction pthread_create, il tente d'écrire n'importe où en mémoire (par exemple, si i = 53093, il tente d'écrire à l'endroit tid[53093], ce qui est largement en dehors du tableau tid qui ne fait que 4 de long. Résultat, Tu tapes n'importe où en mémoire, ce qui explique ton segmentation fault.

Je ne cherche pas plus loin (il peut y avoir d'autres erreurs). Ceci dit, je te conseille fortement de revoir ton code complètement, voire de réouvrir tes cours de C, ça pourra t'être utile smile

Bon TP, et n'hésite pas à poser des questions si ya des trucs que tu ne comprends pas.

Hors ligne

#9 Le 07/03/2007, à 00:42

Jonny_the_dog

Re : [RESOLU] C fonction thread non reconnue

euh.... si je ne me plante pas, i n'est pas initialiser, donc tid[i] est surement hors du tableau donc ça foir

ta oublier une boucle for je pense

edit : "grillé"

Dernière modification par Jonny_the_dog (Le 07/03/2007, à 00:43)

Hors ligne

#10 Le 07/03/2007, à 22:53

LaFouine1986

Re : [RESOLU] C fonction thread non reconnue

Bonsoir,
un grand merci pour votre aide et votre patience !

Alors, mea culpa, il est évident que tout ca c'est du C, et non du C++, c'est du je pense à un réflexe, je n'ai pas fait gaffe...
j'ai également pas mis dans mon précédent message le code de la fonction appelée, d'où le fait que ca ne compile pas, et que traverseTunnel soit inconnu...

je vous le mets en dessous :

void* traverseTunnel(void* voidparam)
{	char *direction = (char*) voidparam;
	
	if(direction == "FTE")
	{
		while(1)
		{
			if(nbVoitureETF==0)
			{
				if(nbVoitureFTE==0)
				{
					pthread_mutex_lock(&verrouETF);
				}
				nbVoitureFTE++;
				printf("%s  : on va de la france vers espagne \n", direction);
				sleep(1);
				nbVoitureFTE--;
				if(nbVoitureFTE==0)
				{
					pthread_mutex_unlock(&verrouETF);
				}
				printf("je suis sorti \n");
				pthread_exit(1);
			}
			//else printf(".");
		}
	}
	if(direction == "ETF")
	{
		while(1)
		{
			if(nbVoitureFTE==0)
			{ 
				if(nbVoitureETF==0)
				{
					pthread_mutex_lock(&verrouFTE);
				}
				nbVoitureETF++;
				printf("%s  : on va de la l'espagne vers la france \n", direction);
				sleep(1);
				nbVoitureETF--;
				if(nbVoitureETF==0)
				{
					pthread_mutex_unlock(&verrouFTE);
				}
				printf("je suis sorti \n");
				pthread_exit(1);
			}
			//else printf(".");
		}
	}
return 0;

}

Sinon j'avoue ne pas tout comprendre concernant le problème de char * FTE= "FTE";...

Je vais m'y repencher ce soir, et notamment enfin initialiser i...
je reviendrais bientôt pour tenir au courant !

merci encore,

Hors ligne

#11 Le 07/03/2007, à 23:02

LaFouine1986

Re : [RESOLU] C fonction thread non reconnue

re bonsoir,

j'ai initialisé i à 0, puis je l'ai fait incrémenter de 1 à chaque création de nouveaux threads, et c'est bon tout fonctionne ! Je ne devais pas etre bien réveillé quand je constate le nombre d'erreurs stupides que j'ai pu faire.

Un énorme merci pour votre aide rapide, et si vous avez des explications concernant le char * FTE="FTE" je suis preneur !!

Hors ligne

#12 Le 08/03/2007, à 10:37

Gari

Re : [RESOLU] C fonction thread non reconnue

La principale différence vient du fait que, sous C, les "string" (du C++) n'existent pas.
Ben en fait il faut comprendre un peu ce qu'il se passe lorsque le programme tourne.
A l'instant où tu exécutes la ligne char * FTE = "FTE", voilà ce qu'il se passe (pas forcément dans l'ordre où je l'écris, je ne suis pas non plus un Dieu de la compilation C) :
1. Déclaration de la variable FTE.
- Réservation en mémoire de suffisamment d'octets pour stocker un objet de type (char*). En faisant un sizeof(char *), on réalise que c'est 4 octets (comme tout pointeur en fait). 
- On définit le label "FTE" à cette place mémoire, de manière à y accéder lorsqu'on appelle la variable FTE.
2. Création de la chaîne "FTE".
- Réservation en mémoire de suffisamment de place pour stocker la chaîne donnée (3 caractères utiles + un caractère terminateur = 4 octets)
- Ecriture de "FTE" + caractère terminateur dans cet emplacement.
3. Lien entre la variable et la chaîne FTE.
C'est là le problème. la chaine "FTE" est en réalité un pointeur sur l'emplacement créé à l'étape 2. Ca tombe bien, la variable FTE est une variable de type "pointeur sur char *".
Donc, ce que tu fais lorsque tu fais l'égalité, c'est que tu places l'adresse mémoire où se trouve la chaine "FTE" dans la variable FTE. Donc, la variable FTE permet d'accéder à cet emplacement (utilisation classique d'un pointeur).

MAIS, car il y a un mais, une fois l'instruction passée, le programme libère l'emplacement où se trouve la chaîne "FTE" (puisqu'elle a été créée temporairement pour l'instruction). Quand je parle de libération, je veux dire que, pour le système, l'emplacement où se trouvait la chaîne "FTE" est de nouveau libre pour toute autre utilisation. "FTE" se trouve toujours à cet emplacement, mais à n'importe quel moment, n'importe quel programme peut décider d'y placer autre chose !.
Ainsi, ton programme semble fonctionner (puisqu'il accède à l'emplacement où se trouve effectivement "FTE"), mais il peut y avoir un bug "pseudo-aléatoire" qui fera planter ton programme si un autre programme (ou si TON programme) se décide subitement à utiliser la partie de la mémoire (réputée libre) où se trouve la chaine "FTE".

Voilà la correction :

Déclaration d'une variable de type "chaine de 4 caractères".
char FTE[4];

Initialisation de la variable :
strcpy(FTE,"FTE");
Cette fonction permet de mettre "FTE" dans FTE. (cherche dans le "man" si tu veux des explications). Ici aussi, le programme va créer une variable temporaire "FTE", mais il va copier caractère par caractère cette chaine temporaire dans FTE. FTE ne va donc pas "pointer" sur la chaine temporaire... Qui pourra être détruite sans soucis.
Cet appel de fonction est équivalent à
FTE[0] = 'F';
FTE[1] = 'T';
FTE[2] = 'E';
FTE[3] = '\0';

Ensuite, dans le code de traverseTunnel, je ne pige pas comment le test d'égalité direction == "FTE" peut être vrai. Il faudrait pour cela que le programme réutilise le même emplacement mémoire pour la nouvelle variable temporaire... (C'est possible, cependant).
Pour comparer deux chaines, utiliser strcmp.
==> if (strcmp(direction,"FTE")==0) permet de tester si les chaines sont égales (man strcmp pour plus d'infos).

Voilà, en espérant avoir été clair et ne pas m'être trompé quelque part. smile

Hors ligne

#13 Le 08/03/2007, à 19:36

LaFouine1986

Re : [RESOLU] C fonction thread non reconnue

oki, je comprends mieux maintenant... Ce n'est pas super, je vais donc modifier cela.
Merci pour ces explications !

Hors ligne