data singleton and sigchld handler advancements
This commit is contained in:
parent
09e823bf2b
commit
83bde42e02
9 changed files with 48 additions and 16 deletions
|
|
@ -29,6 +29,8 @@ extern t_data *g_data;
|
||||||
void job_new(t_data *data, char **av, pid_t pid);
|
void job_new(t_data *data, char **av, pid_t pid);
|
||||||
void job_announce(t_job *job);
|
void job_announce(t_job *job);
|
||||||
|
|
||||||
|
int ft_cmppid(t_job *job, pid_t *pid);
|
||||||
|
|
||||||
void sigchld_handler(int signo);
|
void sigchld_handler(int signo);
|
||||||
void sigint_handler(int signo);
|
void sigint_handler(int signo);
|
||||||
void sigtstp_handler(int signo);
|
void sigtstp_handler(int signo);
|
||||||
|
|
|
||||||
|
|
@ -76,6 +76,8 @@ typedef enum e_qstate t_qstate;
|
||||||
extern t_stof g_builtins[];
|
extern t_stof g_builtins[];
|
||||||
extern pid_t g_pid;
|
extern pid_t g_pid;
|
||||||
|
|
||||||
|
t_data *data_singleton();
|
||||||
|
|
||||||
int data_init(t_data *data);
|
int data_init(t_data *data);
|
||||||
void data_exit(t_data *data);
|
void data_exit(t_data *data);
|
||||||
void ft_cleanup(void);
|
void ft_cleanup(void);
|
||||||
|
|
|
||||||
|
|
@ -1 +1 @@
|
||||||
Subproject commit 42e1a190bd86ea288ee9a367fefeac8284a67cf4
|
Subproject commit 5fab2c76b033729a3b16a15f2b5ac63f2deaafc4
|
||||||
|
|
@ -1,4 +1,5 @@
|
||||||
#!/bin/sh
|
#!/bin/sh
|
||||||
while [ 1 ]; do
|
while [ 1 ]; do
|
||||||
sleep 1
|
sleep 1
|
||||||
|
echo "a"
|
||||||
done
|
done
|
||||||
|
|
|
||||||
6
42sh/src/job-control/ft_cmppid.c
Normal file
6
42sh/src/job-control/ft_cmppid.c
Normal file
|
|
@ -0,0 +1,6 @@
|
||||||
|
#include "minishell.h"
|
||||||
|
|
||||||
|
int ft_cmppid(t_job *job, pid_t *pid)
|
||||||
|
{
|
||||||
|
return (job->pid - *pid);
|
||||||
|
}
|
||||||
|
|
@ -18,6 +18,7 @@ void job_new(t_data *data, char **av, pid_t pid)
|
||||||
|
|
||||||
DG("got new job");
|
DG("got new job");
|
||||||
job.command = ft_sstrcat(av, ' ');
|
job.command = ft_sstrcat(av, ' ');
|
||||||
|
DG("job command '%s'", job.command);
|
||||||
job.pid = pid;
|
job.pid = pid;
|
||||||
job.id = 42;
|
job.id = 42;
|
||||||
ft_lstadd(&data->jobc.list, ft_lstnew(&job, sizeof(job)));
|
ft_lstadd(&data->jobc.list, ft_lstnew(&job, sizeof(job)));
|
||||||
|
|
|
||||||
|
|
@ -12,20 +12,31 @@
|
||||||
|
|
||||||
#include "minishell.h"
|
#include "minishell.h"
|
||||||
|
|
||||||
t_data *g_data;
|
|
||||||
|
|
||||||
void sigchld_handler(int signo)
|
void sigchld_handler(int signo)
|
||||||
{
|
{
|
||||||
|
int status;
|
||||||
|
pid_t pid;
|
||||||
t_job *job;
|
t_job *job;
|
||||||
|
t_list *start;
|
||||||
t_list *list;
|
t_list *list;
|
||||||
|
|
||||||
(void)signo;
|
(void)signo;
|
||||||
DG("got SIGCHLD");
|
DG("got SIGCHLD");
|
||||||
list = g_data->jobc.list;
|
start = data_singleton()->jobc.list;
|
||||||
|
pid = waitpid(-1, &status, WNOHANG);
|
||||||
|
DG("SIGCHLD pid=%i", pid);
|
||||||
|
/* start = NULL; */
|
||||||
|
list = start ? ft_lst_find(start, &pid, ft_cmppid) : NULL;
|
||||||
if (list)
|
if (list)
|
||||||
|
{
|
||||||
job = list->content;
|
job = list->content;
|
||||||
|
if (status == 0)
|
||||||
|
ft_printf("[%i] + done\t%s\n", job->id, job->command);
|
||||||
|
else
|
||||||
|
ft_printf("[%i] + exit %i\t%s\n", job->id, status, job->command);
|
||||||
|
ft_prompt();
|
||||||
|
}
|
||||||
else
|
else
|
||||||
job = NULL;
|
DG("SIGCHLD but no find");
|
||||||
if (job)
|
|
||||||
DG("job pid=%i", job->pid);
|
|
||||||
}
|
}
|
||||||
|
|
|
||||||
10
42sh/src/main/data_singleton.c
Normal file
10
42sh/src/main/data_singleton.c
Normal file
|
|
@ -0,0 +1,10 @@
|
||||||
|
#include "minishell.h"
|
||||||
|
|
||||||
|
t_data *data_singleton()
|
||||||
|
{
|
||||||
|
static t_data *data = NULL;
|
||||||
|
|
||||||
|
if (data == NULL)
|
||||||
|
data = malloc(sizeof(t_data));
|
||||||
|
return (data);
|
||||||
|
}
|
||||||
|
|
@ -12,27 +12,26 @@
|
||||||
|
|
||||||
#include "minishell.h"
|
#include "minishell.h"
|
||||||
|
|
||||||
t_data *g_data;
|
|
||||||
|
|
||||||
int main(void)
|
int main(void)
|
||||||
{
|
{
|
||||||
t_data data;
|
|
||||||
t_list *token;
|
t_list *token;
|
||||||
t_btree *ast;
|
t_btree *ast;
|
||||||
|
/* t_data data; */
|
||||||
|
t_data *data;
|
||||||
|
|
||||||
token = NULL;
|
token = NULL;
|
||||||
ast = NULL;
|
ast = NULL;
|
||||||
g_data = &data;
|
data = data_singleton();
|
||||||
if (data_init(&data))
|
if (data_init(data))
|
||||||
return (1);
|
return (1);
|
||||||
DG("{inv}{bol}{gre}start of shell");
|
DG("{inv}{bol}{gre}start of shell");
|
||||||
while (1)
|
while (1)
|
||||||
{
|
{
|
||||||
if (ft_interactive_sh(&data))
|
if (ft_interactive_sh(data))
|
||||||
return (1);
|
return (1);
|
||||||
DG("{inv}{mag}got command '%s'", data.line.input);
|
DG("{inv}{mag}got command '%s'", data->line.input);
|
||||||
token = NULL;
|
token = NULL;
|
||||||
if (ft_tokenize(&token, data.line.input, DEFAULT))
|
if (ft_tokenize(&token, data->line.input, DEFAULT))
|
||||||
return (1);
|
return (1);
|
||||||
if (!token)
|
if (!token)
|
||||||
continue ;
|
continue ;
|
||||||
|
|
@ -42,7 +41,7 @@ int main(void)
|
||||||
btree_print(STDERR, ast, &ft_putast);
|
btree_print(STDERR, ast, &ft_putast);
|
||||||
/* ft_dprintf(STDERR, "\n--- INFIX BREAKDOWN ---\n"); */
|
/* ft_dprintf(STDERR, "\n--- INFIX BREAKDOWN ---\n"); */
|
||||||
/* btree_apply_infix(ast, &ft_putast2); */
|
/* btree_apply_infix(ast, &ft_putast2); */
|
||||||
if (ft_exec(&ast, &data))
|
if (ft_exec(&ast, data))
|
||||||
return (1);
|
return (1);
|
||||||
}
|
}
|
||||||
return (0);
|
return (0);
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue