Implement signal handling for execution
authorLukas Jiriste <ljiriste@student.42prague.com>
Thu, 29 Aug 2024 16:22:30 +0000 (18:22 +0200)
committerLukas Jiriste <ljiriste@student.42prague.com>
Thu, 29 Aug 2024 16:22:30 +0000 (18:22 +0200)
It may need some additional output.

src/execution.c

index a3ba582d5457da80b4aca12051d4b80bb4bf5e89..d9dfe1119e3e0eee55f24bb23721ddd4a89dd482 100644 (file)
@@ -6,7 +6,7 @@
 /*   By: lnikolov <lnikolov@student.42prague.com    +#+  +:+       +#+        */
 /*                                                +#+#+#+#+#+   +#+           */
 /*   Created: 2024/07/21 08:57:54 by ljiriste          #+#    #+#             */
-/*   Updated: 2024/08/28 09:54:48 by ljiriste         ###   ########.fr       */
+/*   Updated: 2024/08/29 18:21:04 by ljiriste         ###   ########.fr       */
 /*                                                                            */
 /* ************************************************************************** */
 
@@ -974,6 +974,21 @@ int        ex_command(t_parse_tree_node *command, t_execution_env *env)
        }
 }
 
+void   killall(t_vec *child_pids, int sig_num)
+{
+       pid_t   child_pid;
+       size_t  i;
+
+       i = 0;
+       while (i < child_pids->size)
+       {
+               child_pid = *(pid_t *)ft_vec_access(child_pids, i);
+               kill(child_pid, sig_num);
+               ++i;
+       }
+       return ;
+}
+
 void   wait_for_return(t_execution_env *env)
 {
        pid_t   last_pid;
@@ -987,8 +1002,11 @@ void      wait_for_return(t_execution_env *env)
                        return ;
                last_pid = *(pid_t *)ft_vec_access(&env->child_pids, env->child_pids.size - 1);
                waitpid(last_pid, &status, 0);
-               if (WIFEXITED(status))
-                       env->ret_val = WEXITSTATUS(status);
+               if (g_last_signal != 0)
+                       killall(&env->child_pids, g_last_signal);
+               if (g_last_signal == 0)
+                       if (WIFEXITED(status))
+                               env->ret_val = WEXITSTATUS(status);
        }
        ft_vec_free(&env->child_pids, NULL);
        return ;
@@ -998,6 +1016,8 @@ int        ex_pipeline(t_parse_tree_node *pipeline, t_execution_env *env, int depth)
 {
        int     pipe_fds[2];
 
+       if (g_last_signal != 0)
+               return (0);
        if (pipeline->children.size == 1)
        {
                if (ex_command(ft_vec_access(&pipeline->children, 0), env))
@@ -1045,5 +1065,10 @@ int      execute(t_tree *parse_tree, t_execution_env *env)
        int     res;
 
        res = ex_program(parse_tree, env);
+       if (g_last_signal != 0)
+       {
+               env->ret_val = 128 + g_last_signal;
+               g_last_signal = 0;
+       }
        return (res);
 }