Erreur de segmentation (langage c)

Fermé
ziedzico Messages postés 393 Date d'inscription mercredi 5 mars 2008 Statut Membre Dernière intervention 12 avril 2014 - 3 nov. 2008 à 01:33
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 à 06:29
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

1 réponse

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 à 06:29
Salut,

Pour commencer enlève le \n dans tes scanf
scanf("%d\n",&taille);
Je n'ai pas étudier ce que fait ton code mais je n'ai pas Erreur de segmentation à l'exécution.

Voici ce que j'ai à la compilation
lami20j@debian:~/trash$ gcc -W -Wall ccm7.c
ccm7.c: In function 'main':
ccm7.c:146: warning: unused variable 'c'
ccm7.c:38: warning: unused variable 'k'
et à l'exécution
lami20j@debian:~/trash$ ./a.out


 =====================Recherche des Entiers Premiers=====================


Jusqu'a quel entier vous voulez que la recherche s'effectue ? (a partir de 2) :9000
taille : 9000
Veuillez donner le nombre de processus participants a la recherche2
On va repartir l'espace de recherche sur des petits intervalles ;
Veuillez indiquer le nombre minimum des intervalles affectes a chaque processus :2
 Veuillez tapez la taille de chaque intervalle :3
Je suis le fils 3741 du père 3740 pour l'ittération n° 0...
7, de mon fils 3741
13, de mon fils 3741
19, de mon fils 3741
31, de mon fils 3741

0