Bonjour,
Comme quelques étudiants, je suis amené faire un shell qui doit bien évidemment gérer, entre autres, l'enchaînement des pipes entre divers processus exécutés.
Pour être direct : Je n'arrive pas à faire marcher. Théoriquement, mon message "Done" ne devrait s'afficher qu'après le résultat du ls, or il s'affiche parfois avant, parfois après
De plus le "less" fonctionne une fois sur 10, et en général pas correctement (en gros il affiche bien "END" pour noter la fin de ce qu'il a reçu par le pipe, mais est "écrasé" par le message Done).
Désolé pour la solution crado retenue pour les exécutables et leurs arguments mais c'est évidemment que pour faire des tets
Désolé également si ça compile pas. Je ne peux plus transférer de mon bsd a mon windows sans que ça corrompe ma clefJ'ai donc dû tout taper à la main et évidemment ce copier coller est moins fiable que le bon vieux cp
Si quelqu'un a une idée, je suis preneur
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
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72 #include <unistd.h> #include <stdlib.h> #include <stdio.h> int do_pipe(int level) { char *exe[] = { "/usr/bin/less", "/usr/bin/grep", "/bin/cat", "/bin/ls", NULL}; char *arg[5][3] = { {"less", NULL, NULL}, {"grep", ".c", NULL}, {"cat", "-e", NULL}, {"ls", "-la", NULL}, {NULL, NULL} }; int fd[2]; int pid; if (pipe(fd) < 0) { fprintf(stderr, "Pipe fail\n"); exit(0); } if (exe[level + 1] != NULL) { pid = fork(); if (pid == -1) { fprintf(stderr, "Fork fail\n"); exit(0); } if (pid == 0) { close(fd[1]); dup2(fd[0], 0); close(fd[0]); execvp(exe[level], arg[level]); } else { close(fd[0]); dup2(fd[1], 1); close(fd[1]); do_pipe(level + 1); return (0); } } else { close(fd[0]); execvp(exe[level], arg[level]); } return (0) } int main() { int pid; pid = fork(); if (pid == 0) do_pipe(0); else { waitpid(0, NULL, 0); printf("Done\n"); } }![]()
Partager