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 clef J'ai donc dû tout taper à la main et évidemment ce copier coller est moins fiable que le bon vieux cp

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");
	}
}
Si quelqu'un a une idée, je suis preneur