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:
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 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); }
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
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); }
Voila a toute !
Partager