Bug du fork sous Linux !!

Fermé
thegimp Messages postés 2 Date d'inscription lundi 29 novembre 2004 Statut Membre Dernière intervention 29 novembre 2004 - 29 nov. 2004 à 09:52
 SuperKoko - 16 nov. 2008 à 14:02
Bonjour,

Voici un programme correct dont l'exécution produit un résultat incorrecte. Je pense que c'est un bug de l'implementation de l'appel système fork() sous linux. Qlq un peut me confirmer ce bug ? Si oui y a-t-il un correctif ?

Merci.

Voici le code :
#include <stdio.h>
#include <signal.h>
#include <wait.h>
#include <sys/types.h>

pid_t pid_fils=33;

void f() {
printf("%d \n", pid_fils);
}

int main(void) {
signal(SIGUSR1, f);
switch ((pid_fils=fork())) {
case -1: perror("fork"); exit(1);
case 0: kill(getppid(), SIGUSR1); exit(0);
default : pause();wait(NULL);
}
exit(0);
}


Le programme affiche 33 au lieu du pid du fils. (Le fils est créer avant que le père n'initialise la variable pid_fils !!!).
A voir également:

4 réponses

Linus Torvald
29 nov. 2004 à 10:11
un bug du fork ?

hum hum ...

tu appelles f() avant le 'fork' dans ton 'main'.
0
Ce n'est pas un appel à f(). C'est un déroutement de signal. Si tu ne connais pas la programmation système sous Linux, ce n'est pas la peine de donner une réponse qui n'a pas de sens.
0
xor > Anonymous
29 nov. 2004 à 14:22
dans ce cas, demandes-toi comment ca se fait que ca t'affiche quelque chose et à quel niveau ......
0
C'est vrai pour le noyau 2.6.x mais pas pour le 2.4.x
0
no bug ! Il faut laisser le temps au temps ....
#include <stdio.h>
#include <signal.h>
#include <wait.h>
#include <sys/types.h>
#include <unistd.h>
#include <stdlib.h>

pid_t pid_fils=33;

void f() {
printf("%d \n", pid_fils);
}

int main(void) {
signal(SIGUSR1, f);
switch ((pid_fils=fork())) {
case -1: perror("fork"); exit(1);
case 0: usleep(10);kill(getppid(), SIGUSR1); exit(0);
default : pause();wait(NULL);
}
exit(0);
}
0
Bon, je sais que ce thread est vieux, mais si quelqu'un tombe dessus, je voudrais signaler que Linux n'est pas buggé.
Ce programme contient une "race condition".
C'est à dire: Entre le moment où fork() a effectivement cloné les processus, et le moment ou le processus parent assigne la valeur de retour du fork() à la variable pid_fils, le fils a eu le temps d'envoyer le signal au processus parent, et le processus parent voyant le signal arriver, exécute immédiatement f().

(En plus, la variable devrait être volatile)
0