Fork n fils de n fils
Fermé
Linquisiteur
-
15 févr. 2013 à 01:13
KX Messages postés 16753 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 25 novembre 2024 - 16 févr. 2013 à 16:28
KX Messages postés 16753 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 25 novembre 2024 - 16 févr. 2013 à 16:28
A voir également:
- Creation de processus avec fork()
- Creation compte gmail - Guide
- Création compte google - Guide
- Media creation tool - Télécharger - Systèmes d'exploitation
- Création groupe whatsapp - Guide
- Création organigramme - Guide
3 réponses
KX
Messages postés
16753
Date d'inscription
samedi 31 mai 2008
Statut
Modérateur
Dernière intervention
25 novembre 2024
3 019
Modifié par KX le 15/02/2013 à 17:13
Modifié par KX le 15/02/2013 à 17:13
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
KX
Messages postés
16753
Date d'inscription
samedi 31 mai 2008
Statut
Modérateur
Dernière intervention
25 novembre 2024
3 019
16 févr. 2013 à 16:03
16 févr. 2013 à 16:03
C'est parce qu'il te manque des #include (en particulier celui qui déclare pid_t), moi je me suis limité à écrire la fonction main, mais elle doit s'insérer dans le reste du fichier.
KX
Messages postés
16753
Date d'inscription
samedi 31 mai 2008
Statut
Modérateur
Dernière intervention
25 novembre 2024
3 019
Modifié par KX le 16/02/2013 à 16:31
Modifié par KX le 16/02/2013 à 16:31
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.