(langage c) erreur lors de l'execution

Résolu/Fermé
ziedzico Messages postés 393 Date d'inscription mercredi 5 mars 2008 Statut Membre Dernière intervention 12 avril 2014 - 2 nov. 2008 à 22:37
lami20j Messages postés 21331 Date d'inscription jeudi 4 novembre 2004 Statut Modérateur, Contributeur sécurité Dernière intervention 30 octobre 2019 - 3 nov. 2008 à 08:03
Bonjour,je suis sur le terminal de linux et je recois "erreur de segmentation" lors de l'execution de mon fichier c malgrais que la compilation a reussie.==============MERCI D4AVANCE=================

je veux affecter a chaque processus fils crée (fork) un sous-intervalle d'entiers pour y chercher les entiers premiers.

voila mon code c :


#include<stdio.h>
#include<stdlib.h>
#include<unistd.h>
#include<sys/types.h>
#include<sys/wait.h>
struct pidpipe
{
pid_t pid;
int fdfils[2];
};

struct pidpremier
{
pid_t pid;
int premier;
};

int Verif(int entier)
{
char *trouve="Vrai";
int i;
for(i=2;i<entier;i++)
{
if((entier%i)==0) trouve="Faux";
}
if (trouve=="Vrai") return (1);
else return(0);
}

main()
{
pid_t pid;
int Tab[10000];
int fdpere[2];
int taille,t,p,fois,i,j,k,cpt;
int B_inf,B_sup,SIGNAL_E,SIGNAL_R;

struct pidpipe pidepipe[p];
struct pidpremier pidpremier[taille];

printf("\n\n =====================Recherche des Entiers Premiers=====================\n\n");

do
{
printf("\nJusqu'a quel entier vous voulez que la recherche s'effectue ? (a partir de 2) :");
scanf("%d\n",&taille);
}
while((taille>10000)||(taille<2));

for(i=1;i<taille;i++)
{
Tab[i]=1+i;
}

do
{
printf("Veuillez donner le nombre de processus participants a la recherche");
scanf("%d\n",&p);
}while(p<1);

printf("On va repartir l'espace de recherche sur des petits intervalles ;\n");

do
{
printf("Veuillez indiquer le nombre minimum des intervalles affectes a chaque processus :");
scanf("%d\n",&fois);
}while(fois>taille/p);

do
{
printf(" Veuillez tapez la taille de chaque intervalle :");
scanf("%d\n",&t);
}while(t>(taille/(p*fois)));

cpt=0;
for(i=0;i<p;i++)
{
pipe(fdpere);
pipe(pidepipe[i].fdfils);
if((pid=fork())==0)
{
close(fdpere[0]);
close(pidepipe[i].fdfils[1]);

printf("Je suis le fils %d du père %d pour l'ittération n° %d...\n",getpid(),getppid(),i);
read(pidepipe[i].fdfils[0],&SIGNAL_R,sizeof(int));

while(SIGNAL_R!=0)
{
read(pidepipe[i].fdfils[0],&B_inf,sizeof(int));
read(pidepipe[i].fdfils[0],&B_sup,sizeof(int));
for(j=B_inf;j<B_sup&&(Tab[j]);j++)
{
if(Verif(Tab[j])==1)
{
SIGNAL_E=Tab[j];
write(fdpere[1],&SIGNAL_E,sizeof(int));
}
}
SIGNAL_E=0;
write(fdpere[1],&SIGNAL_E,sizeof(int));
read(pidepipe[i].fdfils[0],&SIGNAL_R,sizeof(int));
}

printf("Je peut sortir: %d...\n",getpid());
close(fdpere[1]);
close(pidepipe[i].fdfils[0]);
exit(0);
}
else
{
close(fdpere[1]);
close(pidepipe[i].fdfils[0]);
pidepipe[i].pid=pid;

for(j=0;j<=(taille/t)+1;j+=p)
{
SIGNAL_E=1;
write(pidepipe[i].fdfils[1],&SIGNAL_E,sizeof(int));

SIGNAL_E=(i+j)*t;
write(pidepipe[i].fdfils[1],&SIGNAL_E,sizeof(int));

SIGNAL_E=(i+j+1)*t;
write(pidepipe[i].fdfils[1],&SIGNAL_E,sizeof(int));

read(fdpere[0],&SIGNAL_R,sizeof(int));
while(SIGNAL_R!=0)
{
printf("%d, de mon fils %d\n",SIGNAL_R,pid);
pidpremier[cpt].pid=pid;
pidpremier[cpt].premier=SIGNAL_R;
read(fdpere[0],&SIGNAL_R,sizeof(int));
cpt++;
}
}
SIGNAL_E=0;
write(pidepipe[i].fdfils[1],&SIGNAL_E,sizeof(int));

close(fdpere[0]);
close(pidepipe[i].fdfils[1]);
}
}

while(wait(NULL)!=-1);

printf("\n:::::::::::::::::::résultat::::::::::::::::::\n");

char c=getchar();
for(i=0;i<cpt;i++)
{
printf("%d trouve par le processus %d\n",pidpremier[i].premier,pidpremier[i].pid);
}
}


terminal :

ubuntu@ubuntu:~/Desktop$ gcc essai-1.c
ubuntu@ubuntu:~/Desktop$ ./a.out
Erreur de segmentation


je pense que les boucle while et for ne convient pas dans le parcour
ou il y a erreur dans le signal entre le pere et les fils.

aidez moi svp

3 réponses

fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 1 835
3 nov. 2008 à 01:06
Salut,
J'ai pas tout regardé précisément. Mais, déjà je vois des fautes que tu peux corriger.
if(trouve=="Vrai") En C, une comparaison entre deux chaînes de caractères ne se fait pas comme ça sous peine d'avoir la condition toujours fausse. On utilise la fonction strcmp de string.h. Un petit man strcmp pour plus de renseignements.
Ensuite, tu peux pas faire
struct pidpipe pidepipe[p]; (pareil pour l'autre structure).
"p" n'est pas connu au moment de la compilation, donc tu n'auras pas d'allocations. D'où probablement le segfault.
Si tu veux allouer p fois la structure. Tu dois le faire dynamiquement avec malloc de stdlib.h. Pareil, un petit man pour voir son utilisation.
Cdlt
0
ziedzico Messages postés 393 Date d'inscription mercredi 5 mars 2008 Statut Membre Dernière intervention 12 avril 2014 112
3 nov. 2008 à 02:04
c bete je sais pas comme je laisse parfois faire des choses debiles j'ai cru un autre prob !
le faite de ; ne pas mettre \n apre %d
et il faut faire la creatio des struct avec des entiers connus (apres les scanf p et taille)


merci enormement pour votre attention
0
lami20j Messages postés 21331 Date d'inscription jeudi 4 novembre 2004 Statut Modérateur, Contributeur sécurité Dernière intervention 30 octobre 2019 3 567
3 nov. 2008 à 08:03
Salut,

Je n'ai pas étudié le code en profondeur comme l'a fait fiddy ;-)
A savoir que malgré tes erreurs le compilateur ne les montre pas toujours
http://www.commentcamarche.net/forum/affich 9221677 erreur de segmentation langage c?#1

Donc, je pense qu'il faut reprendre ton code tout en écoutant les conseils de fiddy.
0