From c225a51199cc12b5dcf9e5f093dd3c75724b9280 Mon Sep 17 00:00:00 2001 From: hugogogo Date: Tue, 19 Oct 2021 00:17:34 +0200 Subject: [PATCH] un pipe fonctionne pour sleep et ls, code tres incomplet et brouillon dans main et readme --- README.md | 3 +++ srcs/main.c | 45 ++++++++++++++++++++++++++------------------- 2 files changed, 29 insertions(+), 19 deletions(-) diff --git a/README.md b/README.md index b63a2f3..b590f56 100644 --- a/README.md +++ b/README.md @@ -59,6 +59,9 @@ ## 2. lexer (lexique analyser : --- +[wait for all childs to terminate](https://stackoverflow.com/questions/19461744/how-to-make-parent-wait-for-all-child-processes-to-finish) +[close pipes in child AND parents](https://stackoverflow.com/questions/33884291/pipes-dup2-and-exec) + ### 2.1 methode arbre binaire : [transformer arbre normal en arbre binaire](https://fr.wikipedia.org/wiki/Arbre_binaire#Transformation_d'un_arbre_quelconque_en_un_arbre_binaire) diff --git a/srcs/main.c b/srcs/main.c index 70c235c..d69f400 100644 --- a/srcs/main.c +++ b/srcs/main.c @@ -6,7 +6,7 @@ /* By: lperrey +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2021/10/04 05:59:26 by lperrey #+# #+# */ -/* Updated: 2021/10/18 22:29:02 by hulamy ### ########.fr */ +/* Updated: 2021/10/18 23:44:34 by hulamy ### ########.fr */ /* */ /* ************************************************************************** */ @@ -96,47 +96,54 @@ while (++i < pipes->nb_pipes) void execute_cmd(t_all *c, t_pipe *pipes) { pid_t pid; + pid_t wpid; + int status; int i; int stdout_bak; + status = 0; if (pipes->nb_pipes) stdout_bak = dup(STDOUT_FILENO); i = 0; while (i <= pipes->nb_pipes) { - if (pipes->nb_pipes) - { - printf("%i\n", stdout_bak); - if (i == 0) - { - dup2(pipes->pipes_fd[0][1], STDOUT_FILENO); - } - if (i == 1) - { - dup2(pipes->pipes_fd[0][0], STDIN_FILENO); - dup2(stdout_bak, STDOUT_FILENO); - } - close(pipes->pipes_fd[0][0]); - close(pipes->pipes_fd[0][1]); - close(stdout_bak); - } pid = fork(); if (pid == 0) // child { + if (pipes->nb_pipes) + { + if (i == 0) + { + dup2(pipes->pipes_fd[0][1], STDOUT_FILENO); + } + if (i == 1) + { + dup2(pipes->pipes_fd[0][0], STDIN_FILENO); + dup2(stdout_bak, STDOUT_FILENO); + } + close(pipes->pipes_fd[0][0]); + close(pipes->pipes_fd[0][1]); + close(stdout_bak); + } if (!ft_strncmp(pipes->input_split[i], "sleep ", 6)) execve("/bin/sleep", ft_split(pipes->input_split[i], ' '), c->envp); if (!ft_strncmp(pipes->input_split[i], "ls ", 3)) { - write(1, "\na\n\n", 4); execve("/bin/ls", ft_split(pipes->input_split[i], ' '), c->envp); } } if (pid > 0) // parent { - wait(0); + if (pipes->nb_pipes) + { + close(pipes->pipes_fd[0][0]); + close(pipes->pipes_fd[0][1]); + close(stdout_bak); + } } i++; } + while ((wpid = wait(&status)) > 0); } void shell_loop(t_all *c)