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->av = NULL;
|
||||||
p->pid = 0;
|
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);
|
btree_delone(ast, &ast_free);
|
||||||
return (0);
|
return (0);
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -23,13 +23,12 @@ int process_setgroup(t_process *p, pid_t pid)
|
||||||
j = &data_singleton()->exec.job;
|
j = &data_singleton()->exec.job;
|
||||||
if (!j->pgid)
|
if (!j->pgid)
|
||||||
j->pgid = pid ? pid : getpid();
|
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);
|
setpgid(pid, j->pgid);
|
||||||
if (pid == 0 && JOB_IS_FG(j->attributes))
|
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);
|
tcsetpgrp(STDIN, j->pgid);
|
||||||
signal(SIGTTOU, SIG_DFL);
|
|
||||||
}
|
}
|
||||||
return (0);
|
return (0);
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -2,7 +2,7 @@
|
||||||
|
|
||||||
void process_setsig(void)
|
void process_setsig(void)
|
||||||
{
|
{
|
||||||
signal(SIGINT, SIG_DFL);
|
/* signal(SIGINT, SIG_DFL); */
|
||||||
signal(SIGQUIT, SIG_DFL);
|
signal(SIGQUIT, SIG_DFL);
|
||||||
signal(SIGTSTP, SIG_DFL);
|
signal(SIGTSTP, SIG_DFL);
|
||||||
signal(SIGTTIN, SIG_DFL);
|
signal(SIGTTIN, SIG_DFL);
|
||||||
|
|
|
||||||
|
|
@ -16,5 +16,8 @@ void job_run(t_job *job, int foreground)
|
||||||
{
|
{
|
||||||
mark_job_as_running(job);
|
mark_job_as_running(job);
|
||||||
job_format(job, JOBS_OPTS_L);
|
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;
|
pid_t pid;
|
||||||
int status;
|
int status;
|
||||||
|
|
||||||
if (job_is_stopped(id) || job_is_completed(id))
|
DG("waiting for [%i]", id);
|
||||||
|
if (job_is_stopped(id))
|
||||||
return (0);
|
return (0);
|
||||||
|
job_update_status();
|
||||||
pid = waitpid(WAIT_ANY, &status, WUNTRACED);
|
pid = waitpid(WAIT_ANY, &status, WUNTRACED);
|
||||||
while (!process_mark_status(pid, status)
|
while (!process_mark_status(pid, status)
|
||||||
&& !job_is_completed(id)
|
&& !job_is_completed(id)
|
||||||
|
|
|
||||||
|
|
@ -32,7 +32,7 @@ int process_mark_status(pid_t pid, int status)
|
||||||
p->attributes |= PROCESS_COMPLETED;
|
p->attributes |= PROCESS_COMPLETED;
|
||||||
if (WIFSIGNALED(status))
|
if (WIFSIGNALED(status))
|
||||||
ft_printf("{mag}%d: Terminated by signal %d.\n{eoc}",
|
ft_printf("{mag}%d: Terminated by signal %d.\n{eoc}",
|
||||||
(int)pid, WTERMSIG(p->status));
|
(int)pid, WTERMSIG(status));
|
||||||
}
|
}
|
||||||
return (0);
|
return (0);
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -16,6 +16,6 @@ int put_job_in_background(t_job *j, int cont)
|
||||||
{
|
{
|
||||||
if (cont)
|
if (cont)
|
||||||
if (kill(-j->pgid, SIGCONT) < 0)
|
if (kill(-j->pgid, SIGCONT) < 0)
|
||||||
DG("kill (SIGCONT) malfunction");
|
DG("kill(SIGCONT) failed");
|
||||||
return (0);
|
return (0);
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -17,16 +17,21 @@ int put_job_in_foreground(t_job *j, int cont)
|
||||||
t_jobc *jobc;
|
t_jobc *jobc;
|
||||||
|
|
||||||
jobc = &data_singleton()->jobc;
|
jobc = &data_singleton()->jobc;
|
||||||
tcsetpgrp (STDIN, j->pgid);
|
DG("pid:%i gonna setpgrp(%i) (JOB)", getpid(), j->pgid);
|
||||||
|
tcsetpgrp(STDIN, j->pgid);
|
||||||
|
tcsetattr(STDIN, TCSADRAIN, &jobc->shell_tmodes);
|
||||||
|
|
||||||
if (cont)
|
if (cont)
|
||||||
{
|
{
|
||||||
tcsetattr(STDIN, TCSADRAIN, &j->tmodes);
|
tcsetattr(STDIN, TCSADRAIN, &j->tmodes);
|
||||||
if (kill(-j->pgid, SIGCONT) < 0)
|
if (kill(-j->pgid, SIGCONT) < 0)
|
||||||
DG("kill (SIGCONT) malfunction");
|
DG("kill(SIGCONT) failed");
|
||||||
}
|
}
|
||||||
job_wait(j->id);
|
job_wait(j->id);
|
||||||
|
DG("finished waiting for [%i]", j->id);
|
||||||
job_remove(j->id);
|
job_remove(j->id);
|
||||||
|
|
||||||
|
DG("pid:%i gonna setpgrp(%i) (SHELL)", getpid(), jobc->shell_pgid);
|
||||||
tcsetpgrp(STDIN, jobc->shell_pgid);
|
tcsetpgrp(STDIN, jobc->shell_pgid);
|
||||||
|
|
||||||
tcgetattr(STDIN, &j->tmodes);
|
tcgetattr(STDIN, &j->tmodes);
|
||||||
|
|
|
||||||
|
|
@ -15,5 +15,5 @@
|
||||||
void sigint_handler(int signo)
|
void sigint_handler(int signo)
|
||||||
{
|
{
|
||||||
(void)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)
|
int ft_readline(void)
|
||||||
{
|
{
|
||||||
signal(SIGWINCH, ft_reset_stats_term);
|
signal(SIGWINCH, ft_reset_stats_term);
|
||||||
|
ft_save_stats_term();
|
||||||
if (tcsetattr(0, TCSANOW, ft_stats_term_termcaps()) == -1)
|
if (tcsetattr(0, TCSANOW, ft_stats_term_termcaps()) == -1)
|
||||||
return (-1);
|
return (-1);
|
||||||
if (data_singleton()->line.input)
|
if (data_singleton()->line.input)
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue