Bonjour,
extrait de mon vieux "Programmation Linux" chez Eyrolles, un petit exemple pour comprendre les mécanismes du fork et, ma foi, jusque là ça va :
Voici les résultats, dans la console, avec n=8 :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46 /* compiler avec gcc -o fork fork.c */ #include <sys/types.h> #include <unistd.h> #include <stdio.h> #include <string.h> #include <errno.h> #include <fcntl.h> int main(int argc, char *argv[]) { pid_t pid; char *message; int n; printf("Lancement du prog...\n"); pid = fork(); switch(pid) { case -1: perror("échec du fork"); return(1); case 0: message = "Voici le fils"; n = 5; break; default: message = "Message du père"; n = 8; // 3 pour terminer le père avant le fils = sortie désordonnée // sortie plus propre avec 8, le fils se terminant avant le père break; } for (; n > 0; n--) { printf("%s n=%d pid=%d\n", message, n, pid); sleep(1); } if (pid == 0) { printf("Fin du fils\n"); } else printf("Fin du père\n"); return (0); }
On voit bien les messages de fin du fils et du père, lignes 13 et 16.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16 Lancement du prog... Message du père n=8 pid=4501 Voici le fils n=5 pid=0 Message du père n=7 pid=4501 Voici le fils n=4 pid=0 Message du père n=6 pid=4501 Voici le fils n=3 pid=0 Message du père n=5 pid=4501 Voici le fils n=2 pid=0 Message du père n=4 pid=4501 Voici le fils n=1 pid=0 Message du père n=3 pid=4501 Fin du fils Message du père n=2 pid=4501 Message du père n=1 pid=4501 Fin du père
La question, et le problème, c'est que ce comportement (le message de fin, que ce soit celui du père ou celui du fils) est totalement inexistant lorsque j'essaye de comprendre le fonctionnement de "fuse" à partir des exemples du web :
que ce soit le hello.c "officiel" (les lignes alignées à gauche toute sont mes ajouts) :
ou le bbfs.c d'un tuto qui a l'air correct et dont voici la fin du main :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11 int main(int argc, char *argv[]) { int ret; fprintf(stdout, "before fuse_main\n"); // vu fflush (NULL); /** man: If the stream argument is NULL, fflush() flushes all open output streams */ ret = fuse_main(argc, argv, &hello_oper, NULL); fflush (NULL); fprintf(stdout, "after fuse_main\n"); // jamais vu, malgré les fflush fflush (NULL); return(ret); }
Les commentaires que j'ai insérés indiquent clairement que quelque chose m'échappe, surtout par rapport à ce qu'on peut trouver dans des discussions où d'autres s'y cassent les dents aussi (c'est moi qui met en gras les 3 derniers mots) :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4 // turn over control to fuse fprintf(stderr, "about to call fuse_main\n"); // vu fuse_stat = fuse_main(argc, argv, &bb_oper, bb_data); fprintf(stderr, "fuse_main returned %d\n", fuse_stat); // jamais vu
Est-ce que je m'y prends mal, ou est-ce qu'il y a un bug planqué dans un coin et que personne à ce jour n'aurait vu ? Lié à des changements de version de librairie(s) système, et donc de comportement, peut-être ?fuse_main just daemonizes your program. It is still running, and after you unmount the file system, fuse_main will return and program execution will continue normally.
Parce qu'in fine, si le professeur (dernier exemple) a pris le temps et s'est donné le mal de publier son code et d'écrire un tuto, c'est qu'il a vu sur sa console les mots "fuse_main returned valeur-fuse_stat", sinon il n'aurait pas publié ! Enfin, il me semble...
Merci pour vos retours,
Partager