Bonjour a tous !

Je suis actuellement entrain de commencer a recoder un minishell, j ai actuellement un gros probleme avec l implantation de la fonction readline avec mon simple pipe, en effet bizarrement le pipe yes | head fonctionne parfaitement, par contre ls | wc -l ne m affiche absolument rien sur la sortie standard, par contre la commande pwd | grep "test" fonctionne mais m affiche le resultat directement apres mon prompt ce qui est plutot bizzare car j attends la fin de tout mes processus fils avant de reappeller readline et donc d afficher le prompt

J ai l impression que readline modifie mon fd stdin car si je n utilise pas la fonction et que je remplace les in_put de readline par la commande direct par exemple in_put = "ls | wc -l", le pipe m affiche bien le bon resultat, j ai pense reset stdin avec l appel a readline mais cela ne fonctionne pas non plus, auriez vous donc une idee de ce qui cloche svp ?

Voici la partie du code qui nous interesse:

main.c:
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
int	main(int argc, char **argv, char **envp)
{
	char	*prompt;
	char	*in_put;
	int	is_alive;
	int status;
int oldstdin;
	int oldstdout;
 
	argc = (int) argc;
	argv = (char **)argv;
	envp = (char **) envp;
	prompt = ">$";
	is_alive = 1;
	while (is_alive)
	{
		in_put = readline(prompt);
		add_history(in_put);
               dup2(oldstdin, STDIN_FILENO);
		dup2(oldstdout, STDOUT_FILENO);
		if (!run_pipe(in_put, envp))
			return (1);
		waitpid(-1, &status, 0);
	}
return (0);
}
pipex.c:

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
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
char	**make_cmd(char *one_string_cmd, char **envp)
{
	char	**cmd;
	char	*tempo_cmd;
	size_t	i;
 
	cmd = ft_split(one_string_cmd, ' ');
	if (!cmd)
		return (NULL);
	tempo_cmd = format_string(cmd);
	if (!tempo_cmd)
		return (NULL);
	cmd[0] = tempo_cmd;
	i = 0;
	while (envp[i] && ft_strncmp(envp[i], "PATH=", 5) != 0)
		++i;
	tempo_cmd = find_path(envp, cmd, i);
	if (!tempo_cmd)
		return (NULL);
	cmd[0] = tempo_cmd;
	return (cmd);
}
void	receiver(char *input_cmd, char **envp, int *pipe_fd, size_t num_proc, size_t pipes_nb)
{
	char	**cmd;
 
	//verif make cmd
	cmd = make_cmd(input_cmd, envp);
	pipes_nb = (size_t) pipes_nb;
	num_proc = (size_t) num_proc;
 
		close(pipe_fd[1]);
		dup2(pipe_fd[0], 0);
		close(pipe_fd[0]);
	execve(cmd[0], cmd, envp);
	//verif execve
}
void	sender(char *input_cmd, char **envp, int *pipe_fd, size_t num_proc, size_t pipes_nb)
{
	char	**cmd;
 
	//verif make cmd
	cmd = make_cmd(input_cmd, envp);
	pipes_nb = (size_t) pipes_nb;
	num_proc = (size_t) num_proc;
 
		close(pipe_fd[0]);
		dup2(pipe_fd[1], 1);
		close(pipe_fd[1]);
	execve(cmd[0], cmd, envp);
	//verif execve
}
 
int	run_pipe(char *in_put, char **envp)
{
	size_t	i;
	size_t	pipes_nb;
	pid_t	pid;
	char	**cmds;
	int	pipes_fd[2];
 
	i = 0;
	pipes_nb = 0;
	while (*(in_put + i))
	{
		if (*(in_put + i) == '|')
			++pipes_nb;
		++i;
	}
	cmds = ft_split(in_put, '|');
	envp = (char **) envp;
 
	if (pipe(pipes_fd) == -1)
	{
		printf("Erreur init pipe\n");
		return (0);
	}
 
	i = 0;
	while (i < pipes_nb + 1)
	{
		pid = fork();
		if (pid < 0)
		{
			perror("Probleme fork");
			return(0);
		}
		else if (pid == 0)
		{
			if (i == 0)
				sender(cmds[i], envp, pipes_fd, i, pipes_nb);
			else
				receiver(cmds[i], envp, pipes_fd, i, pipes_nb);
		}
		++i;
	}
	return (1);
}
Je tiens a preciser que j ai teste le formattage des commandes envoye a execve et que je n ai trouve aucuns soucis par rapport a ca

Voila a toute !