Bug du fork sous Linux !!
thegimp
Messages postés
2
Statut
Membre
-
SuperKoko -
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 !!!).
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:
- Bug du fork sous Linux !!
- Linux reader - Télécharger - Stockage
- Bug chromecast - Guide
- R-linux - Télécharger - Sauvegarde
- Toutou linux - Télécharger - Systèmes d'exploitation
- Backtrack linux - Télécharger - Sécurité
4 réponses
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.
xor
>
Anonymous
dans ce cas, demandes-toi comment ca se fait que ca t'affiche quelque chose et à quel niveau ......
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);
}
#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);
}
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)
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)