Bonjour,
Dans le livre de Stevens et Rago, ils donnent l'exemple de programme suivant pour illustrer comment fonctionnent les pipes:
Je ne comprenais pas pourquoi close(fd[1]) est mis au début du fils au lieu d'être mis à la fin du père. J'ai donc modifié le programme ainsi (il faut décommenter):
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 #include<stdio.h> #include<stdlib.h> #include<unistd.h> int main(void) { int n; int fd[2]; pid_t pid; char line[4096]; if (pipe(fd)<0) printf("pipe error"); if ((pid = fork()) < 0){ printf("fork error"); } else if (pid >0) { close(fd[0]); write(fd[1], "hello world\n", 12); } else { close (fd[1]); n = read(fd[0], line, 4096); write(STDOUT_FILENO, line, n); } exit(0); }
Je voulais forcer le fils à s'exécuter en premier. Je n'y suis pas arrivé! Le programme n'écrit jamais "fils"! En revanche, si j'exécute le programme en commentant comme je l'ai fait (c'est-à-dire sans close, ni write ni read), il écrit bien "fils" puis "père". C'est pour moi un mystère. Quelqu'un a-t-il une explication? Merci d'avance.
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 #include<stdio.h> #include<stdlib.h> #include<unistd.h> int main(void) { int n; int fd[2]; pid_t pid; char line[4096]; if (pipe(fd)<0) printf("pipe error"); if ((pid = fork()) < 0){ printf("fork error"); } else if (pid >0) {waitpid(pid, NULL, 0); printf("père"); /* close(fd[0]); write(fd[1], "hello world\n", 12); */ } else {printf("fils"); /* close (fd[1]); n = read(fd[0], line, 4096); write(STDOUT_FILENO, line, n); */ } exit(0); }
Partager