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 :
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);
}
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
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
On voit bien les messages de fin du fils et du père, lignes 13 et 16.

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) :
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);
}
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
    // 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
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) :
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.
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 ?

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,