Fork n fils de n fils
Linquisiteur
-
KX Messages postés 16761 Date d'inscription Statut Modérateur Dernière intervention -
KX Messages postés 16761 Date d'inscription Statut Modérateur Dernière intervention -
Bonjour, j'ai un problème en C. j'ai tenter de me lancer dans les forks mais j'ai rencontrer un petit problème avec les fils de fils des fork...
Le but étant un programme donc le père créera N fils qui a leur tour (les fils) créeront n petit-fils.
Je poste ici le code. Je commence a me débrouiller en C mais les forks étant une nouvelle (grosse) étape et je suis un peu perdu (si vous avez de bon tuto au passage ;) )
Le but étant un programme donc le père créera N fils qui a leur tour (les fils) créeront n petit-fils.
Je poste ici le code. Je commence a me débrouiller en C mais les forks étant une nouvelle (grosse) étape et je suis un peu perdu (si vous avez de bon tuto au passage ;) )
#include <stdio.h> #include <stdlib.h> #include <sys/wait.h> #include <unistd.h> #include <sys/types.h> #include <string.h> int main (int argc, char * argv[]){ int nb; puts ("Combien de fils voulez-vous? "); scanf ("%d", &nb); int nbfils; puts ("Combien de fils de fils voulez-vous? "); scanf ("%d", &nbfils); printf ("Nous allons créé %d fils\n", nb); printf ("Nous allons créé %d de fils de fils\n", nbfils); int cpt = 0; int cptfils = 0; while (cpt < nb) // boucle fils { pid_t a = fork(); if (a < 0) { perror ("le fork a rate\n"); exit(EXIT_FAILURE); } if (a == 0) { printf("Je suis le fils de pid %d, a vaut %d, mon pere est %d \n", getpid(), a, getppid()); cptfils = 0; while (cptfils < nbfils) // boucle petit fils { pid_t b = fork(); if (b < 0) { perror ("le fork du petit-fils a rate\n"); exit(EXIT_FAILURE); } if (b == 0) { printf("Je suis le petit fils de pid %d, a vaut %d, mon pere est %d \n", getpid(), b, getppid()); exit(0); } cptfils++; } cpt++; } } printf("Je suis le pere de pid %d\n", getpid()); for(cpt=0;cpt<nb;cpt++) wait(0); for(cptfils=0;cptfils<nbfils;cptfils++) wait(0); exit(EXIT_SUCCESS); }
A voir également:
- Creation de processus avec fork()
- Creation de compte google - Guide
- Creation de site web - Guide
- Creation compte gmail - Guide
- Media creation tool - Télécharger - Systèmes d'exploitation
- Creation compte vinted - Guide
3 réponses
Tu n'as pas clairement expliqué quel était le problème. Et comme je suis sous Windows je n'ai pas pu tester, mais un des problèmes est je pense ton cpt++
En effet l'incrémentation a lieu pour tous les fils or la boucle ne devrait continuer que pour les pères (tu as pensé à faire un exit(0) pour les petits fils, mais pas pour les fils)
Remarque : je t'invite à faire intervenir cpt et cptfils dans tes affichages, il est plus facile de s'y retrouver dans l'ordre des appels qu'avec les pid.
Rappel : je n'ai pas testé ce code !
En effet l'incrémentation a lieu pour tous les fils or la boucle ne devrait continuer que pour les pères (tu as pensé à faire un exit(0) pour les petits fils, mais pas pour les fils)
Remarque : je t'invite à faire intervenir cpt et cptfils dans tes affichages, il est plus facile de s'y retrouver dans l'ordre des appels qu'avec les pid.
Rappel : je n'ai pas testé ce code !
int main() { int nb, nbfils, cpt; printf("Combien de fils voulez-vous ? "); scanf("%d", &nb); printf("Combien de petit-fils voulez-vous (pour chaque fils) ? "); scanf ("%d", &nbfils); for (cpt=0; cpt<nb; cpt++) { int cptfils; pid_t a = fork(); if (a < 0) { printf("echec du fork cpt=%d err=%d\n",cpt,a); return 1; } else if (a == 0) { printf("Je suis le fils cpt=%d\n", cpt); for (cptfils=0; cptfils<nbfils; cptfils++) { pid_t b = fork(); if (b < 0) { printf("echec du fork cpt=%d cptfils=%d err=%d\n",cpt,cptfils,a); return 1; } else if (b == 0) { printf("Je suis un fils de cpt=%d (cptfils=%d)\n", cpt, cptfils); return 0; } else // b>0 { printf("Je suis le fils cpt=%d heureux de la naissance de mon fils cptfils=%d\n",cpt,cptfils); } } return 0; } else // a>0 { printf("Je suis le pere, heureux de la naissance de mon fils cpt=%d\n",cpt); } } return 0; }La confiance n'exclut pas le contrôle
merci j'ai tester le programme et j'obtiens ceci comme erreur
exo3.c:14: error: 'pid_t' undeclared (first use in this function)
exo3.c:14: error: (Each undeclared identifier is reported only once
exo3.c:14: error: for each function it appears in.)
exo3.c:14: error: parse error before "a"
exo3.c:16: error: 'a' undeclared (first use in this function)
exo3.c:27: error: parse error before "b"
exo3.c:29: error: 'b' undeclared (first use in this function)
exo3.c:54:2: warning: no newline at end of file
Pourtant dans mes autres exercice je n'ai pas eu a déclarer cela ^^'
J'ai essayer avec main argc... aussi
exo3.c:14: error: 'pid_t' undeclared (first use in this function)
exo3.c:14: error: (Each undeclared identifier is reported only once
exo3.c:14: error: for each function it appears in.)
exo3.c:14: error: parse error before "a"
exo3.c:16: error: 'a' undeclared (first use in this function)
exo3.c:27: error: parse error before "b"
exo3.c:29: error: 'b' undeclared (first use in this function)
exo3.c:54:2: warning: no newline at end of file
Pourtant dans mes autres exercice je n'ai pas eu a déclarer cela ^^'
J'ai essayer avec main argc... aussi
Les argc et argv en C servent à passer des options au programme.
Exemple simple :
À exécuter pour comprendre :
C'est également à cela que sert l'args en Java :
À exécuter pour comprendre :
Remarque : en C, on peut enlever argc et argv si on ne s'en sert pas, et faire simplement int main(), en revanche en Java on est obligé de toujours avoir un tableau, même si on ne s'en sert pas.
Exemple simple :
int main(int argc, char* argv[]) { int i; printf("Nombre de valeurs : %d\n",argc); for (i=0; i<argc; i++) printf("argument %d = %s\n",i,argv[i]); return 0; }
À exécuter pour comprendre :
./monProgramme ./monProgramme option1 option2 option3
C'est également à cela que sert l'args en Java :
public static void main(String[] args) { System.out.printf("Nombre de valeurs : %d\n",args.length); for (int i=0; i<args.length; i++) System.out.printf("argument %d = %s\n",i,args[i]); }
À exécuter pour comprendre :
java MaClasse java MaClasse option1 option2 option3
Remarque : en C, on peut enlever argc et argv si on ne s'en sert pas, et faire simplement int main(), en revanche en Java on est obligé de toujours avoir un tableau, même si on ne s'en sert pas.