some nices fixes, works nicely
This commit is contained in:
parent
62cdc4ca84
commit
6ad4ca1848
10 changed files with 23 additions and 12 deletions
|
|
@ -57,7 +57,8 @@ int exec_command(t_btree **ast)
|
|||
}
|
||||
p->av = NULL;
|
||||
p->pid = 0;
|
||||
p->attributes = PROCESS_PIPESTART | PROCESS_PIPEEND;
|
||||
/* p->attributes = PROCESS_PIPESTART | PROCESS_PIPEEND; */
|
||||
p->attributes &= ~(PROCESS_STATE_MASK | PROCESS_TYPE_MASK);
|
||||
btree_delone(ast, &ast_free);
|
||||
return (0);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -23,13 +23,12 @@ int process_setgroup(t_process *p, pid_t pid)
|
|||
j = &data_singleton()->exec.job;
|
||||
if (!j->pgid)
|
||||
j->pgid = pid ? pid : getpid();
|
||||
DG("in pid %i gonna setpgid(%i, %i)", getpid(), pid, j->pgid);
|
||||
DG("pid:%i gonna setpgid(%i, %i)", getpid(), pid, j->pgid);
|
||||
setpgid(pid, j->pgid);
|
||||
if (pid == 0 && JOB_IS_FG(j->attributes))
|
||||
{
|
||||
signal(SIGTTOU, SIG_IGN);
|
||||
DG("pid:%i gonna setpgrp(%i)", getpid(), j->pgid);
|
||||
tcsetpgrp(STDIN, j->pgid);
|
||||
signal(SIGTTOU, SIG_DFL);
|
||||
}
|
||||
return (0);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -2,7 +2,7 @@
|
|||
|
||||
void process_setsig(void)
|
||||
{
|
||||
signal(SIGINT, SIG_DFL);
|
||||
/* signal(SIGINT, SIG_DFL); */
|
||||
signal(SIGQUIT, SIG_DFL);
|
||||
signal(SIGTSTP, SIG_DFL);
|
||||
signal(SIGTTIN, SIG_DFL);
|
||||
|
|
|
|||
|
|
@ -16,5 +16,8 @@ void job_run(t_job *job, int foreground)
|
|||
{
|
||||
mark_job_as_running(job);
|
||||
job_format(job, JOBS_OPTS_L);
|
||||
foreground ? put_job_in_foreground(job, 1) : put_job_in_background(job, 1);
|
||||
if (foreground)
|
||||
put_job_in_foreground(job, 1);
|
||||
else
|
||||
put_job_in_background(job, 1);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -17,8 +17,10 @@ int job_wait(int id)
|
|||
pid_t pid;
|
||||
int status;
|
||||
|
||||
if (job_is_stopped(id) || job_is_completed(id))
|
||||
DG("waiting for [%i]", id);
|
||||
if (job_is_stopped(id))
|
||||
return (0);
|
||||
job_update_status();
|
||||
pid = waitpid(WAIT_ANY, &status, WUNTRACED);
|
||||
while (!process_mark_status(pid, status)
|
||||
&& !job_is_completed(id)
|
||||
|
|
|
|||
|
|
@ -32,7 +32,7 @@ int process_mark_status(pid_t pid, int status)
|
|||
p->attributes |= PROCESS_COMPLETED;
|
||||
if (WIFSIGNALED(status))
|
||||
ft_printf("{mag}%d: Terminated by signal %d.\n{eoc}",
|
||||
(int)pid, WTERMSIG(p->status));
|
||||
(int)pid, WTERMSIG(status));
|
||||
}
|
||||
return (0);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -16,6 +16,6 @@ int put_job_in_background(t_job *j, int cont)
|
|||
{
|
||||
if (cont)
|
||||
if (kill(-j->pgid, SIGCONT) < 0)
|
||||
DG("kill (SIGCONT) malfunction");
|
||||
DG("kill(SIGCONT) failed");
|
||||
return (0);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -17,16 +17,21 @@ int put_job_in_foreground(t_job *j, int cont)
|
|||
t_jobc *jobc;
|
||||
|
||||
jobc = &data_singleton()->jobc;
|
||||
DG("pid:%i gonna setpgrp(%i) (JOB)", getpid(), j->pgid);
|
||||
tcsetpgrp(STDIN, j->pgid);
|
||||
tcsetattr(STDIN, TCSADRAIN, &jobc->shell_tmodes);
|
||||
|
||||
if (cont)
|
||||
{
|
||||
tcsetattr(STDIN, TCSADRAIN, &j->tmodes);
|
||||
if (kill(-j->pgid, SIGCONT) < 0)
|
||||
DG("kill (SIGCONT) malfunction");
|
||||
DG("kill(SIGCONT) failed");
|
||||
}
|
||||
job_wait(j->id);
|
||||
DG("finished waiting for [%i]", j->id);
|
||||
job_remove(j->id);
|
||||
|
||||
DG("pid:%i gonna setpgrp(%i) (SHELL)", getpid(), jobc->shell_pgid);
|
||||
tcsetpgrp(STDIN, jobc->shell_pgid);
|
||||
|
||||
tcgetattr(STDIN, &j->tmodes);
|
||||
|
|
|
|||
|
|
@ -15,5 +15,5 @@
|
|||
void sigint_handler(int signo)
|
||||
{
|
||||
(void)signo;
|
||||
DG("got SIGINT in process %i", getpid());
|
||||
DG("pid:%i got SIGINT", getpid());
|
||||
}
|
||||
|
|
|
|||
|
|
@ -66,6 +66,7 @@ void ft_reset_stats_term(int signal)
|
|||
int ft_readline(void)
|
||||
{
|
||||
signal(SIGWINCH, ft_reset_stats_term);
|
||||
ft_save_stats_term();
|
||||
if (tcsetattr(0, TCSANOW, ft_stats_term_termcaps()) == -1)
|
||||
return (-1);
|
||||
if (data_singleton()->line.input)
|
||||
|
|
|
|||
Loading…
Reference in a new issue