Contenu | Rechercher | Menus

Annonce

Ubuntu 16.04 LTS
Commandez vos DVD et clés USB Ubuntu-fr !

Si vous avez des soucis pour rester connecté, déconnectez-vous puis reconnectez-vous depuis ce lien en cochant la case
Me connecter automatiquement lors de mes prochaines visites.

#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 sad sad !!
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é hmm

#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