Création de processus sous linux en C
Salut chers menbres ;), j'ai un problème par rapport à un exercice.
EXO:
Ecrire un programme en C, qui demande un entier n > 1 à l'utilisateur. Puis crée n processus fils dont la tâches est de générer un nombre aléatoire, qu'il affiche sous le format : processus fils N°i nbreAleatoire = xxxx. Le processus fils, transfère alors à partir d'un pipe le nombre aléatoire qu'il à générer au processus Père. Une fois tous les processus fils on terminer leur jobs, le processus père affiche tous les nombre aléatoires généres sous le format.
PF1 : nbrAleatoire = xxxx.
Voici le code que j'ai écrit pour le programme. Mais j'ai une erreur : lorsque un processus fils est créer lors de la création du suivant le process prédecesseur devient son parent, or moi je voudrait avoir un process père pour n process fils.
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31
| #include <stdlib.h>
#include <stdio.h>
#include <unistd.h>
#include <sys/wait.h>
#include <errno.h>
int main ( int argc , char ** argv )
{
/* Prise du pid du père avant de créer le fils */
pid_t pidPere = getpid() ;
// Création d un processus fils
int n = 0, i = 0;
printf("Veuillez entrer un entier naturel n:");
scanf("%d",&n);
//tableau pour contenir les process
pid_t pidFils[n];
for(i = 0; i < n; i++){
//creation des processus fils
if(getpid() == pidPere){
pidFils[i] == fork();
if ( pidFils[i] == -1) {
perror ( " Erreur de création du fils " ) ;
exit ( EXIT_FAILURE ) ;
}else if(pidFils[i] ==0){
printf("Creation reussi\n");
printf ( " Dans le Fils : pid = % d \n " , getpid ()) ;
printf ( "Pid du père : ppid = % d \n \n " , getppid ()) ;
}
}
}
return EXIT_SUCCESS;
} |
Quelques questions et suite de l'exo
Bonjour Sve@r, Merci pour votre aide. J'ai quelques zone d'ombre au niveau de votre code je n'ai pas compris comment vous avez créer le processus père, aussi le but du exit(0) et de sleep(5).J'ai aussi constater que lors de l'exécution de votre programme le premier element du tableau est le pid du père, mais comment arrive t'on à créer les fils à partir de ce drenier ?
Enfin pour la suite de l'exercice en ce qui concerne la génération des nombres aléatoire par chaque process voiçi ce que j'ai fait :
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55
| nt mon_aleatoire (void);
int main ( int argc , char ** argv )
{
// Création d un processus fils
int n = 0, i = 0;
printf("Veuillez entrer un entier naturel n:");
scanf("%d",&n);
//tableau pour contenir les process
pid_t pidFils[n];
for (i=0; i < n; i++) {
//creation du processus fils
pidFils[i] = fork();
switch (pidFils[i]) {
case -1:
perror ("Erreur de création du fils") ;
exit(EXIT_FAILURE) ;
break;
case 0: // Fils
printf("Creation reussie\n");
printf("Dans le Fils : pid = %d, ppid=%d\n", getpid(), getppid()) ;
//generation du nombre aleatoire
printf("processus fils N°%d nbreAleatoire = %d\n\n", i+1,mon_aleatoire ());
sleep(5);
exit(0);
break;
default: // Pere
printf("i=%d, Pid du père : pid=%d \n", i, getpid ()) ;
}
}
wait(NULL);
return EXIT_SUCCESS;
}
int mon_aleatoire (void)
{
static int tab[N];
static int first = 0;
int index;
int rn;
if (first == 0)
{
int i;
srand (time (NULL));
for (i = 0; i < N; i++)
tab[i] = rand();
first = 1;
}
index = (int)(rand() / RAND_MAX * (N - 1));
rn = tab[index];
tab[index] = rand();
return (rn);
} |
Mais je sais pas si c'est ce qu'il faut faire réellement.
Merci pour votre Aide.
Comment procéder pour la création du pipe ?
Merçi pour vos explications je comprend enfin beaucoup de chose. En ce qui concerne la création du pipe et l'envoie du nombre aléatoire au père j'ai toujours du mal à pouvoir le faire.Je ne sais pas en réalité par ou commencer.