Erreur de segmentation (langage c)
ziedzico
Messages postés
393
Date d'inscription
Statut
Membre
Dernière intervention
-
lami20j Messages postés 21331 Date d'inscription Statut Modérateur, Contributeur sécurité Dernière intervention -
lami20j Messages postés 21331 Date d'inscription Statut Modérateur, Contributeur sécurité Dernière intervention -
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
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
A voir également:
- Erreur de segmentation (langage c)
- Erreur 0x80070643 - Accueil - Windows
- Erreur 4101 france tv - Forum Lecteurs et supports vidéo
- J'aime par erreur facebook notification - Forum Facebook
- Code erreur f3500-31 ✓ - Forum Bbox Bouygues
- Java code erreur 1603 ✓ - Forum Windows
1 réponse
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
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