data singleton and sigchld handler advancements

This commit is contained in:
Jack Halford 2016-12-12 00:43:03 +01:00
parent 09e823bf2b
commit 83bde42e02
9 changed files with 48 additions and 16 deletions

View file

@ -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);

View file

@ -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

View file

@ -1,4 +1,5 @@
#!/bin/sh #!/bin/sh
while [ 1 ]; do while [ 1 ]; do
sleep 1 sleep 1
echo "a"
done done

View file

@ -0,0 +1,6 @@
#include "minishell.h"
int ft_cmppid(t_job *job, pid_t *pid)
{
return (job->pid - *pid);
}

View file

@ -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)));

View file

@ -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);
} }

View 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);
}

View file

@ -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);