Bug du fork sous Linux !!

thegimp Messages postés 2 Statut Membre -  
 SuperKoko -
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
 
un bug du fork ?

hum hum ...

tu appelles f() avant le 'fork' dans ton 'main'.
0
Anonymous
 
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
 
dans ce cas, demandes-toi comment ca se fait que ca t'affiche quelque chose et à quel niveau ......
0
Anony
 
C'est vrai pour le noyau 2.6.x mais pas pour le 2.4.x
0
landouille
 
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
SuperKoko
 
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