From 480adc8c90de69ff0bf8183c6d45c65dcc8654f1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Laure=CE=B7t?= Date: Wed, 21 Apr 2021 15:12:19 +0200 Subject: [PATCH] stable v2 --- jobs.c | 153 +++++++++++++++++++++++---------------------------- jobs.h | 4 +- minishell | Bin 32976 -> 33016 bytes minishell.c | 34 ++++++++---- minishell2 | Bin 0 -> 32072 bytes minishell2.c | 122 ++++++++++++++++++++++++++++++++++++++++ 6 files changed, 215 insertions(+), 98 deletions(-) create mode 100755 minishell2 create mode 100644 minishell2.c diff --git a/jobs.c b/jobs.c index a78ccc7..f86a8e7 100644 --- a/jobs.c +++ b/jobs.c @@ -3,128 +3,113 @@ #include #include "jobs.h" -void ajouter(list *l_ptr, int pid, int id, char **seq) +void ajouter(list *l_ptr, int pid, int id, char **seq, int state) { - cell *new_cell = malloc(sizeof(*new_cell)); + cell *new_cell = malloc(sizeof(*new_cell)); - char *cmd; - cmd = malloc(sizeof(char) * 256); - cmd[0] = '\0'; + char *cmd; + cmd = malloc(sizeof(char) * 256); + cmd[0] = '\0'; - while (*seq) - { - strcat(cmd, *seq); - seq++; - strcat(cmd, " "); - } + while (*seq) + { + strcat(cmd, *seq); + seq++; + strcat(cmd, " "); + } - new_cell->pid = pid; - new_cell->id = id; - new_cell->cmd = cmd; + new_cell->pid = pid; + new_cell->id = id; + new_cell->cmd = cmd; + new_cell->state = state; - if (*l_ptr == NULL) - { - new_cell->next = NULL; - } - else - { - new_cell->next = *l_ptr; - } + if (*l_ptr == NULL) + { + new_cell->next = NULL; + } + else + { + new_cell->next = *l_ptr; + } - *l_ptr = new_cell; - - printf("[%d] %d %s\n", id, pid, cmd); + *l_ptr = new_cell; } void supprimer(list *l_ptr, int pid) { - cell *cursor = *l_ptr; + cell *cursor = *l_ptr; - if (cursor->pid == pid) - { - cell *cursor2free = cursor; - *l_ptr = cursor->next; - printf("[%d] (%d) done: %s\n", cursor->id, cursor->pid, cursor->cmd); - free(cursor2free); - } - else - { - while (cursor->next != NULL) + if (cursor->pid == pid) { - if (cursor->next->pid == pid) - { - break; - } - else - { - cursor = cursor->next; - } + cell *cursor2free = cursor; + *l_ptr = cursor->next; + free(cursor2free); + } + else + { + while (cursor->next != NULL) + { + if (cursor->next->pid == pid) + { + break; + } + else + { + cursor = cursor->next; + } + } + cell *cursor_next = cursor->next->next; + free(cursor->next); + cursor->next = cursor_next; } - cell *cursor_next = cursor->next->next; - printf("[%d] (%d) done: %s\n", cursor->id, cursor->pid, cursor->cmd); - free(cursor->next); - cursor->next = cursor_next; - } } void afficher(list *l_ptr) { - cell *cursor = *l_ptr; + cell *cursor = *l_ptr; - while (cursor != NULL) - { - printf("[%d] %d\n", cursor->id, cursor->pid); - cursor = cursor->next; - } + while (cursor != NULL) + { + printf("[%d] %d\n", cursor->id, cursor->pid); + cursor = cursor->next; + } } void initialiser(list *l_ptr) { - *l_ptr = NULL; + *l_ptr = NULL; } void liberer(list *l_ptr) { - free(*l_ptr); - *l_ptr = NULL; -} - -int est_vide(list l_ptr) -{ - return l_ptr == NULL; -} - -int contiens(list *l_ptr, int pid) -{ - cell *cursor = *l_ptr; - - while (cursor != NULL) - { - if (cursor->pid == pid) + cell* cursor2free; + cell* cursor = *l_ptr; + while (cursor != NULL) { - return 1; + cursor2free = cursor; + cursor = cursor->next; + free(cursor2free); } - cursor = cursor->next; - } - return 0; + free(*l_ptr); + *l_ptr = NULL; } cell *trouver(list *l_ptr, int pid) { - cell *cursor = *l_ptr; + cell *cursor = *l_ptr; - while (cursor != NULL) - { - if (cursor->pid == pid) + while (cursor != NULL) { - return cursor; + if (cursor->pid == pid) + { + return cursor; + } + cursor = cursor->next; } - cursor = cursor->next; - } - return NULL; // erreur + return NULL; // erreur } \ No newline at end of file diff --git a/jobs.h b/jobs.h index 2b54d0a..e843816 100644 --- a/jobs.h +++ b/jobs.h @@ -8,16 +8,16 @@ struct cell int pid; char *cmd; cell *next; + int state; }; typedef cell *list; -void ajouter(cell **list, int pid, int id, char **cmd); +void ajouter(cell **list, int pid, int id, char **cmd, int state); void supprimer(cell **list, int pid); void afficher(cell **list); void initialiser(list *list); void liberer(list *list); -int contiens(list *l_ptr, int pid); cell *trouver(list *l_ptr, int pid); #endif \ No newline at end of file diff --git a/minishell b/minishell index f94d9cf152a9461318f332ab16b98b69097be465..367476a3050533e4db6047a35b2fb4aa3bf11a1c 100755 GIT binary patch delta 7537 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 T^9WWV#>;0Lo^!>~=3f5^$v!FR diff --git a/minishell.c b/minishell.c index f9a49fd..8df7cf8 100644 --- a/minishell.c +++ b/minishell.c @@ -21,14 +21,22 @@ jmp_buf start; void handler_print(int signal_num, siginfo_t *info) { - if (contiens(&jobs, info->si_pid)) - { // pid dans la lsite des proccess en fond + cell* job = trouver(&jobs, info->si_pid); + if (job) + { // pid dans la lite des proccess en fond + if (job->state) + { + job->state = 0; + siglongjmp(start, signal_num); + } + if (prompting) - { // si il n'y a pas d'execution de procces actuellement + { // si il n'y a pas d'execution de proccess actuellement printf("\n"); } - supprimer(&jobs, info->si_pid); + printf("[%d] (%d) done: %s\n", job->id, job->pid, job->cmd); + supprimer(&jobs, job->pid); job_id--; if (prompting) @@ -38,34 +46,34 @@ void handler_print(int signal_num, siginfo_t *info) } } -void handler_restart(int signal_num, siginfo_t *info) +void handler_restart(int signal_num) { printf("\n"); siglongjmp(start, signal_num); } -void handler_stop(int signal_num, siginfo_t *info) +void handler_stop(int signal_num) { if (!prompting) { kill(pidFils, SIGTSTP); - ajouter(&jobs, pidFils, job_id++, *(cmd->seq)); + ajouter(&jobs, pidFils, job_id++, *(cmd->seq), 1); + printf("[%d] (%d) suspended: %s\n", job_id, pidFils, *(cmd->seq)); siglongjmp(start, signal_num); } else { - handler_restart(signal_num, info); + handler_restart(signal_num); } } int main(int argc, char *argv[]) { - extern int errno; initialiser(&jobs); - // gestion de SIGCHLD + // gestion des signaux struct sigaction action; sigemptyset(&action.sa_mask); action.sa_flags = SA_SIGINFO | SA_RESTART; @@ -76,7 +84,7 @@ int main(int argc, char *argv[]) action.sa_handler = handler_stop; sigaction(SIGTSTP, &action, NULL); - // variables de "pwd" + // variables pour afficher le path char initcd[256], currentcd[256]; getcwd(initcd, 256); @@ -157,7 +165,8 @@ int main(int argc, char *argv[]) { // instructions du père if (cmd->backgrounded) { // on sauvegarde le pid, si background - ajouter(&jobs, pidFils, job_id++, *(cmd->seq)); + ajouter(&jobs, pidFils, job_id++, *(cmd->seq), 0); + printf("[%d] %d\n", job_id, pidFils); } else { // on attend le fils, si foreground @@ -178,5 +187,6 @@ int main(int argc, char *argv[]) } } + liberer(&jobs); return EXIT_SUCCESS; } \ No newline at end of file diff --git a/minishell2 b/minishell2 new file mode 100755 index 0000000000000000000000000000000000000000..c5e00cb4d2cdf491071594a00fc6305ca3241b2f GIT binary patch literal 32072 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 C&`!?) literal 0 HcmV?d00001 diff --git a/minishell2.c b/minishell2.c new file mode 100644 index 0000000..fdf7aa9 --- /dev/null +++ b/minishell2.c @@ -0,0 +1,122 @@ +#define _GNU_SOURCE + +#include +#include +#include +#include +#include +#include +#include +#include +#include "readcmd.h" +#include "jobs.h" + +struct cmdline *cmd; +int pid_fils; +int job_id = 0; +list jobs; +int prompting = 0; +jmp_buf goto_prompt; + +void handler_sigchld(int signal_num, siginfo_t *info) +{ + cell *job = trouver(&jobs, info->si_pid); + if (job) + { + if (prompting) + { + printf("\n"); + } + + printf("[%d] (%d) done: %s\n", job->id, job->pid, job->cmd); + supprimer(&jobs, job->pid); + job_id--; + + if (prompting) + { + siglongjmp(goto_prompt, signal_num); + } + } +} + +int main(int argc, char *argv[]) +{ + initialiser(&jobs); + + extern int errno; + + // gestion des signaux + struct sigaction action; + sigemptyset(&action.sa_mask); + action.sa_flags = SA_SIGINFO | SA_RESTART; + action.sa_handler = handler_sigchld; + sigaction(SIGCHLD, &action, NULL); + + // loop principal + while (1) + { + sigsetjmp(goto_prompt, 1); + + prompting = 1; + printf(">>> "); + cmd = readcmd(); + prompting = 0; + + if (cmd == NULL) + { // EOF + break; + } + else if (cmd->seq[0] == NULL) + { // empty + continue; + } + else if (!strcmp(cmd->seq[0][0], "exit")) + { // "exit" + break; + } + + pid_fils = fork(); + if (pid_fils == -1) + { // fork fail ? + fprintf(stderr, "ERROR: forking failed, (%d) %s\n", errno, strerror(errno)); + exit(errno); + } + + if (pid_fils == 0) + { // instructions du fils + if (cmd->backgrounded) + { // background + action.sa_handler = SIG_IGN; + sigaction(SIGINT, &action, NULL); // on ignore SIGINT + } + execvp(cmd->seq[0][0], cmd->seq[0]); + exit(errno); // si execlp échoue on exit avec une erreur + } + else + { // instructions du père + if (cmd->backgrounded) + { // background + ajouter(&jobs, pid_fils, ++job_id, *(cmd->seq), 0); + printf("[%d] %d\n", job_id, pid_fils); + } + else + { // foreground + int wait_code; + pid_t id_fils = waitpid(pid_fils, &wait_code, 0); // on attend la fin de l'exec du fils + + if (id_fils == -1) + { // wait fail ? + fprintf(stderr, "ERROR: waiting for %d failed, (%d) %s\n", wait_code, errno, strerror(errno)); + exit(errno); + } + + if (wait_code) + { // execvp fail ? + fprintf(stderr, "ERROR: %d's execution failed, (%d) %s\n", pid_fils, wait_code, strerror(wait_code)); + } + } + } + } + + return EXIT_SUCCESS; +} \ No newline at end of file