From 9061e43bea624b5e5343c3424a226c4f725d8b79 Mon Sep 17 00:00:00 2001 From: Jack Halford Date: Sun, 12 Mar 2017 22:01:25 +0100 Subject: [PATCH] new process group handling is goooooood --- 42sh/includes/lexer.h | 2 +- 42sh/src/exec/exec_leaf.c | 4 ++-- 42sh/src/exec/launch_file.c | 2 +- 42sh/src/exec/launch_process.c | 2 -- 42sh/src/exec/launch_subshell.c | 5 ++++- 42sh/src/exec/mark_process_status.c | 2 +- 42sh/src/exec/process_setgroup.c | 5 ++++- 42sh/src/exec/process_setsig.c | 2 ++ 42sh/src/job-control/job_addprocess.c | 4 ++-- 42sh/src/job-control/job_remove.c | 1 + 42sh/src/job-control/put_job_in_foreground.c | 9 ++++----- 42sh/src/main/main.c | 1 - 12 files changed, 22 insertions(+), 17 deletions(-) diff --git a/42sh/includes/lexer.h b/42sh/includes/lexer.h index 7c5e0999..618939db 100644 --- a/42sh/includes/lexer.h +++ b/42sh/includes/lexer.h @@ -23,7 +23,7 @@ | TK_DO | TK_IF | TK_FI | TK_THEN | TK_ELIF | TK_ELSE) enum e_lexstate { - DEFAULT, + DEFAULT, //#define DEFAULT 0 PAREN, HEREDOC, NEWLINE, diff --git a/42sh/src/exec/exec_leaf.c b/42sh/src/exec/exec_leaf.c index 10d7b78f..c367c141 100644 --- a/42sh/src/exec/exec_leaf.c +++ b/42sh/src/exec/exec_leaf.c @@ -22,9 +22,9 @@ int exec_leaf(t_btree **ast) return (1); if (!(launch_process(&p))) { - DG("forked pid=[%i], name=[%s]", p.pid, p.data.cmd.av[0]); + /* DG("forked pid=[%i], name=[%s]", p.pid, p.data.cmd.av[0]); */ job_addprocess(&p); - DG("[IS_BG->%i]", JOB_IS_BG(job->attrs)); + /* DG("[IS_BG->%i]", JOB_IS_BG(job->attrs)); */ if (IS_PIPEEND(p)) { if (JOB_IS_FG(job->attrs)) diff --git a/42sh/src/exec/launch_file.c b/42sh/src/exec/launch_file.c index 977b944e..3a005fa9 100644 --- a/42sh/src/exec/launch_file.c +++ b/42sh/src/exec/launch_file.c @@ -21,7 +21,7 @@ int launch_file(t_process *p) { /* data_singleton()->opts &= ~SH_INTERACTIVE; */ /* data_singleton()->opts &= ~SH_OPTS_JOBC; */ - DG("fork! [%s]", p->data.cmd.av[0]); + /* DG("fork! [%s]", p->data.cmd.av[0]); */ process_setgroup(p, 0); process_setsig(); if (process_redirect(p)) diff --git a/42sh/src/exec/launch_process.c b/42sh/src/exec/launch_process.c index 666620c4..57bb96dd 100644 --- a/42sh/src/exec/launch_process.c +++ b/42sh/src/exec/launch_process.c @@ -29,7 +29,6 @@ int launch_process(t_process *p) { int pid; - DG("launchprocess"); if (p->type >= PROCESS_MAX) return (-1); if (!g_launchmap[p->type].f) @@ -38,7 +37,6 @@ int launch_process(t_process *p) p->attrs |= PROCESS_RUNNING; if (!(pid = (*g_launchmap[p->type].f)(p))) { - DG("gonna reset fds"); process_resetfds(p); return (1); } diff --git a/42sh/src/exec/launch_subshell.c b/42sh/src/exec/launch_subshell.c index 1861e144..cc7cd24d 100644 --- a/42sh/src/exec/launch_subshell.c +++ b/42sh/src/exec/launch_subshell.c @@ -14,11 +14,14 @@ static int do_subshell(t_process *p) { - int ret; + int ret; ft_exec(&p->data.subshell.content); ret = ft_atoi(ft_getenv(data_singleton()->env, "?")); DG("CHECK, ret=[%i]", ret); + /* p = ft_lstlast(j->first_process)->content; */ + /* ret = p->status */ + /* DG("CHECK, ret=[%i]", ret); */ return (ret); } diff --git a/42sh/src/exec/mark_process_status.c b/42sh/src/exec/mark_process_status.c index 02d74dc6..6a7eca78 100644 --- a/42sh/src/exec/mark_process_status.c +++ b/42sh/src/exec/mark_process_status.c @@ -32,7 +32,7 @@ int mark_process_status(pid_t pid, int status) { p = plist->content; p->status = status; - DG("marking pid=[%i], name=[%s]", p->pid, p->data.cmd.av[0]); + /* DG("found pid=[%i], name=[%s]", p->pid, p->data.cmd.av[0]); */ if (WIFSTOPPED(status)) { p->attrs &= ~PROCESS_STATE_MASK; diff --git a/42sh/src/exec/process_setgroup.c b/42sh/src/exec/process_setgroup.c index f23c2100..35b83760 100644 --- a/42sh/src/exec/process_setgroup.c +++ b/42sh/src/exec/process_setgroup.c @@ -21,13 +21,16 @@ int process_setgroup(t_process *p, pid_t pid) (void)p; data = data_singleton(); j = &data->exec.job; + if (!SH_IS_INTERACTIVE(data_singleton()->opts)) + return (0); DG("setpgid(%i, %i)", pid, j->pgid); if (setpgid(pid, j->pgid) == -1) ft_dprintf(2, "{red}%s: internal setpgid() error{eoc}\n", SHELL_NAME); if (pid == 0 && JOB_IS_FG(j->attrs)) { - DG("I'm taking the terminal !"); + DG("tcsetpgrp[%i]", j->pgid); tcsetpgrp(STDIN, j->pgid); + DG("after tcsetpgrp"); } return (0); } diff --git a/42sh/src/exec/process_setsig.c b/42sh/src/exec/process_setsig.c index 03c2ed46..96b44ad1 100644 --- a/42sh/src/exec/process_setsig.c +++ b/42sh/src/exec/process_setsig.c @@ -19,5 +19,7 @@ void process_setsig(void) signal(SIGTSTP, SIG_DFL); signal(SIGTTIN, SIG_DFL); signal(SIGTTOU, SIG_DFL); + /* signal(SIGTTIN, sigttin_handler); */ + /* signal(SIGTTOU, sigttou_handler); */ signal(SIGCHLD, SIG_DFL); } diff --git a/42sh/src/job-control/job_addprocess.c b/42sh/src/job-control/job_addprocess.c index 255cfdb4..f56a02e5 100644 --- a/42sh/src/job-control/job_addprocess.c +++ b/42sh/src/job-control/job_addprocess.c @@ -23,8 +23,8 @@ int job_addprocess(t_process *p) { job_update_id(); job->id = jobc->current_id; - /* job->pgid = SH_HAS_JOBC(data_singleton()->opts) ? p->pid : getpid(); */ - job->pgid = p->pid; + job->pgid = SH_IS_INTERACTIVE(data_singleton()->opts) ? p->pid : getpgid(0); + /* job->pgid = p->pid; */ ft_lstadd(&jobc->first_job, ft_lstnew(job, sizeof(*job))); } DG("adding pid=[%i] to pgid=[%i]", p->pid, job->pgid); diff --git a/42sh/src/job-control/job_remove.c b/42sh/src/job-control/job_remove.c index 45f24e9f..fed549a5 100644 --- a/42sh/src/job-control/job_remove.c +++ b/42sh/src/job-control/job_remove.c @@ -23,6 +23,7 @@ void job_remove(int id) if (job_is_completed(id)) { p = ft_lstlast(j->first_process)->content; + /* DG("remove, status=%i", p->status); */ set_exitstatus(p->status, 0); if (id < data_singleton()->jobc.current_id) data_singleton()->jobc.current_id = id; diff --git a/42sh/src/job-control/put_job_in_foreground.c b/42sh/src/job-control/put_job_in_foreground.c index b90d2c7a..d2e9479b 100644 --- a/42sh/src/job-control/put_job_in_foreground.c +++ b/42sh/src/job-control/put_job_in_foreground.c @@ -17,9 +17,9 @@ int put_job_in_foreground(t_job *j, int cont) t_jobc *jobc; jobc = &data_singleton()->jobc; - DG("giving terminal to pgid->[%i]", j->pgid); - tcsetpgrp(STDIN, j->pgid); - + DG("tcsetpgrp[%i]", j->pgid); + if (SH_IS_INTERACTIVE(data_singleton()->opts)) + tcsetpgrp(STDIN, j->pgid); if (cont) { tcsetattr(STDIN, TCSADRAIN, &j->tmodes); @@ -28,8 +28,7 @@ int put_job_in_foreground(t_job *j, int cont) } job_wait(j->id); job_remove(j->id); - - if (SH_HAS_JOBC(data_singleton()->opts)) + if (SH_IS_INTERACTIVE(data_singleton()->opts)) { tcsetpgrp(STDIN, jobc->shell_pgid); tcgetattr(STDIN, &j->tmodes); diff --git a/42sh/src/main/main.c b/42sh/src/main/main.c index c3c3b81b..6635870a 100644 --- a/42sh/src/main/main.c +++ b/42sh/src/main/main.c @@ -124,7 +124,6 @@ int main(int ac, char **av) DG("JOBC is %s, fd=[%i]", SH_HAS_JOBC(data_singleton()->opts)?"ON":"OFF", fd); while (handle_instruction(fd) == 0) { - DG(); // lexer_clean; // parser_clean; ;