#1 Le 20/04/2017, à 16:18
- Jihen Baazouzi
Erreur de segmentation (core dumped)
Bonjour à tous
tout est dans le titre, il s'agit d'un message d'erreur que j'arrive pas à contourner !!
Donc je vous explique !! il s'agit d'un code que crée N processus fils et un processus père communiquant entre eux a travers d'un tube
les fils écrivent des nombres aléatoire et le père lire ces nombres !!
voilà le code en totalité
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/wait.h>
#include <unistd.h> // standard symbolic constants and types
#include <fcntl.h> // file control options
#define TAILLE_MESSAGE 256 // Correspond à la taille de la chaîne à lire et à écrire
void writer (int message, FILE* fichier)
//void writer (const char* message, FILE* fichier)
{
fichier = fopen("fichier_fils.txt", "w");
/* Écrit le message vers le flux et purge immédiatement. */
fprintf (fichier, "%d\n", message);
// fflush (fichier);
fclose(fichier);
}
/* Lit des chaînes aléatoires depuis le flux
aussi longtemps que possible. */
void reader (FILE* fichier)
{
char buffer[1024];
/* Lit jusqu'à ce que l'on atteigne la fin du flux. fgets lit jusqu'à
ce qu'une nouvelle ligne ou une fin de fichier survienne. */
while (!feof (fichier)
&& !ferror (fichier)
&& fgets (buffer, sizeof (buffer), fichier) != NULL)
fputs (buffer, stdout);
}
int main(void)
{
int N=5;
pid_t pid_fils[N];//pid de fils
int i,k;
int pid_pere;
int nombreMystere;
int MAX = 9, MIN = 1;
int nb=0;
/***Tube pour la communication entre le pére et les fils***/
int fds[N+1];
/* Crée un tube. Les descripteurs de fichiers pour les deux bouts du tube
sont placés dans fds. */
pipe (fds);
if(pipe(fds) != 0)
{
fprintf(stderr, "Erreur de création du tube.\n");
return EXIT_FAILURE;
}
/*fds[0] ==> pére
/*fds[i] ==> fils N°i
//////////////////////////////////////////////////////////////
/** fichier journal **/
FILE* journal = NULL;
journal = fopen("journal.txt", "w");
if (journal != NULL)
{
fprintf(journal,"Journal de processus pére \n");
fclose(journal);
}
// fichier pour les fils **/
//FILE* fichier = NULL;
// fichier = fopen("fichier_fils.txt", "w");
//////////////////////////////////////////////////////////////////
/**création de N fils**/
printf("----phase de création de Nfils----\n");
for(i=1;i<=N;i++)
{
srand(time(NULL));//initialise la fonction srand sur le temps actuel.
switch(pid_fils[i]=fork())
{
case -1 : printf("Erreur\n"); exit(1);
case 0 : exit(2);
default :
{
printf("Pere (%d) ayant lancé (%d)\n",getpid(),pid_fils[i]);
/* Nous sommes dans le processus fils N° i */
FILE* fichier = NULL;
/* Ferme notre copie de l'extrémité en lecture
du descripteur de fichier. */
close (fds[0]);
/* Convertit le descripteur de fichier d'écriture en objet FILE
et y écrit des données. */
fichier = fdopen (fds[i], "w");
// Génération du nombre aléatoire
nombreMystere = (rand() % (MAX - MIN + 1)) + MIN;
printf(" PID %d_%d\n",pid_fils[k],nombreMystere);
int message;
message= nombreMystere;
writer (message,fichier);
close (fds[i]);
break;
}
}
pid_pere=getpid();
}
if(fork()!=0)
{
FILE* fichier;
fichier = fopen("stream.txt", "r");
/* Nous sommes dans le processus parent. On ferme notre copie de
l'extrémité en écriture du descripteur de fichiers. */
for(i=1;i<=N;i++){close (fds[i]);}
/* Convertit le descripteur de fichier de lecture en objet FILE
et lit à partir de celui-ci. */
for(i=1;i<=N;i++){
fichier = fdopen (fds[i], "r");
reader (fichier);
close (fds[i]);}
}
printf("le pid de pére est %d \n",pid_pere);
return 0;
}
Dernière modification par Jihen Baazouzi (Le 20/04/2017, à 16:29)
Hors ligne
#2 Le 21/04/2017, à 22:44
- no_spleen
Re : Erreur de segmentation (core dumped)
Bonjour,
Il y a beaucoup de choses qui ne vont pas dans ton programme (déjà, n'oublie pas que les arrays en C commencent à 0, pas à 1).
Mais pour le moment, ton erreur de segmentation vient de la ligne 114.
printf(" PID %d_%d\n",pid_fils[k],nombreMystere);
Car la variable k n'est jamais initialisée.
Pour trouver cela en 10 secondes, tu compiles en mode debug et tu lance ton prog dans gdb.
gcc -g prog.c -o prog
gdb prog
Program received signal SIGSEGV, Segmentation fault.
0x0000000000400dac in main () at prog.c:114
114 printf(" PID %d_%d\n",pid_fils[k],nombreMystere);
Bonne chance !
Hors ligne