Les Allergies
Alimentaires
Posez votre question Signaler

Erreur de segmentation (langage c)

ziedzico 408Messages postés 5 mars 2008Date d'inscription 3 novembre 2011Dernière intervention - Dernière réponse le 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
Lire la suite 

Erreur de segmentation (langage c) »

1 réponses
Réponse
+0
moins plus
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

Ajouter un commentaire
Ce document intitulé « erreur de segmentation (langage c) » issu de CommentCaMarche (www.commentcamarche.net) est mis à disposition sous les termes de la licence Creative Commons. Vous pouvez copier, modifier des copies de cette page, dans les conditions fixées par la licence, tant que cette note apparaît clairement.
Dossier à la une
Passage au tout numérique : quel coût pour les particuliers ?