NewbieContest

Programmation => Langages compilés => Discussion démarrée par: anarcho-hippy-punk le 02 Septembre 2011 à 05:14:13



Titre: Besoin d'aide en C: fork, printf
Posté par: anarcho-hippy-punk le 02 Septembre 2011 à 05:14:13
Bonjour à tous!

J'apprends le C ces temps (pour l'école {ça vous rappelle quelque chose, fork, exec et Cie =)?}), et je tombe sur un os. Voilà mon programme:
Code:
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>

int main() {
pid_t pid;
int i;
for (i=0;i<10;i++) {
pid = fork();

if (pid > 0)
printf("parent %d\n", i);
if (pid < 0)
printf("error forking\n");
else {
printf("child %d\n", i);
exit(0);
}
}
return 0;
}
Et voilà le résultat:
Code:
parent 0
child 0
child 0

Je vous laisse deviner pourquoi ça me plait pas du tout.. J'ai eu d'autres bizarreries du genre.
Quelqu'un peut-il m'expliquer, svp?


Titre: Re : Besoin d'aide en C: fork, printf
Posté par: Ge0 le 02 Septembre 2011 à 21:16:28
Et si t'affichais le contenu de la variable pid au lieu de i ?

http://www.linux-kheops.com/doc/man/manfr/man-html-0.9/man2/fork.2.html

"En cas de succès, le PID du fils est renvoyé au processus parent."

Donc par instinct :

Code:
pid_t pid = fork();
if(pid) {
     printf("Je suis le pere, mon pid est %d et celui de mon fils est %d.\n", getpid(), pid);
} else {
     printf("Je suis le fils, mon pid est %d.\n", getpid());
}

N'ayant fait que trop peu de programmation système sous Linux, je ne peux t'affirmer ce que j'avance.


Titre: Re : Besoin d'aide en C: fork, printf
Posté par: harvey le 03 Septembre 2011 à 01:00:55
Citation
Code:
		if (pid > 0) 
printf("parent %d\n", i);
if (pid < 0)
printf("error forking\n");
else {
printf("child %d\n", i);
exit(0);
Le deuxième 'if' devrait être un 'else if'. Ici, quand le pid est supérieur ou égal à 0 (donc dans le cas du parent et du fils) le processus se termine.


Titre: Re : Besoin d'aide en C: fork, printf
Posté par: anarcho-hippy-punk le 05 Septembre 2011 à 16:55:04
waw... merci

Je crois que je vais aller me cacher pendant un moment  :rolleyes: