diff --git a/jobs b/jobs index fbb8adf..c42736b 100755 Binary files a/jobs and b/jobs differ diff --git a/jobs.c b/jobs.c index 2ea0dd3..e0db70d 100644 --- a/jobs.c +++ b/jobs.c @@ -1,5 +1,6 @@ #include #include +#include #include "jobs.h" void ajouter(list* l_ptr, int pid, int id) { @@ -42,8 +43,6 @@ void supprimer(list* l_ptr, int pid) { cursor->next = cursor_next; } - - } void afficher(list* l_ptr) { diff --git a/jobs.h b/jobs.h index 347c910..17d07c9 100644 --- a/jobs.h +++ b/jobs.h @@ -3,8 +3,10 @@ typedef struct cell cell; struct cell { - int pid; int id; + int pid; + int state; + char* cmd; cell* next; }; @@ -17,4 +19,8 @@ void initialiser(list* list); void liberer(list* list); int contiens(list* l_ptr, int pid); -#endif \ No newline at end of file +#endif + +// state: +// 0: running +// 1: suspended \ No newline at end of file diff --git a/minishell b/minishell index 65982dd..8544c33 100755 Binary files a/minishell and b/minishell differ diff --git a/minishell.c b/minishell.c index bbfd81d..60cd08e 100644 --- a/minishell.c +++ b/minishell.c @@ -15,88 +15,117 @@ int prompting = 0; int job_id = 1; list jobs; -void handler_print(int signal_num, siginfo_t* info) { - if (contiens(&jobs, info->si_pid)) { - if (prompting) { printf("\n"); } - printf("[%d] --> (%d) %s\n", info->si_pid, signal_num, strsignal(signal_num)); - supprimer(&jobs, info->si_pid); - job_id--; - } +void handler_print(int signal_num, siginfo_t *info) +{ + if (contiens(&jobs, info->si_pid)) + { + if (prompting) + { + printf("\n"); + } + printf("[%d] --> (%d) %s\n", info->si_pid, signal_num, strsignal(signal_num)); + supprimer(&jobs, info->si_pid); + job_id--; + } } -int main(int argc, char *argv[]) { +int main(int argc, char *argv[]) +{ - extern int errno; - - initialiser(&jobs); + extern int errno; - struct sigaction action; - action.sa_flags = SA_SIGINFO; //| SA_RESTART; - action.sa_handler = handler_print; - sigemptyset(&action.sa_mask); - sigaction(SIGCHLD, &action, NULL); + initialiser(&jobs); + struct sigaction action; + action.sa_flags = SA_SIGINFO; //| SA_RESTART; + action.sa_handler = handler_print; + sigemptyset(&action.sa_mask); + sigaction(SIGCHLD, &action, NULL); - char initcd[256], currentcd[256]; - getcwd(initcd, 256); + char initcd[256], currentcd[256]; + getcwd(initcd, 256); - while (1) { - getcwd(currentcd, 256); - printf("%s >>> ", currentcd); - prompting = 1; - struct cmdline* cmd = readcmd(); - prompting = 0; + while (1) + { + getcwd(currentcd, 256); + printf("%s >>> ", currentcd); + prompting = 1; + struct cmdline *cmd = readcmd(); + prompting = 0; - if (cmd == NULL || cmd->seq[0] == NULL) { // ligne vide, on skip - continue; - } else if (!strcmp(cmd->seq[0][0], "exit")) { // on quitte le shell - break; - } else if (!strcmp(cmd->seq[0][0], "cd")) { // cd - if (cmd->seq[0][1] == NULL) { // vide - chdir(initcd); - } else { // avec un path - chdir(cmd->seq[0][1]); - } - continue; - } else if (!strcmp(cmd->seq[0][0], "jobs")) { - afficher(&jobs); - continue; - } - - pid_t pidFils = fork(); - - if (pidFils == -1) { - fprintf(stderr, "ERROR: forking failed, %s\n", strerror(errno)); - exit(errno); - } - - if (pidFils == 0) { // fils - execvp(cmd->seq[0][0], cmd->seq[0]); - exit(errno); // si execlp échoue on exit avec une erreur - - } else { // père - if (cmd->backgrounded) { - ajouter(&jobs, pidFils, job_id++); - } else { - jmp_buf env; - setjmp(env); - int codeTerm; - pid_t idFils = waitpid(pidFils, &codeTerm, 0); // on attend la fin de l'exec du fils - - if (idFils == -1){ - - // todo : peut mieux faire ? - if (errno == 4) { - longjmp(env, 1); - } - - fprintf(stderr, "ERROR: waiting for %d failed, (%d) %s\n", codeTerm, errno, strerror(errno)); - exit(errno); + if (cmd == NULL || cmd->seq[0] == NULL) + { // ligne vide, on skip + continue; + } + else if (!strcmp(cmd->seq[0][0], "exit")) + { // on quitte le shell + break; + } + else if (!strcmp(cmd->seq[0][0], "cd")) + { // cd + if (cmd->seq[0][1] == NULL) + { // vide + chdir(initcd); + } + else + { // avec un path + chdir(cmd->seq[0][1]); + } + continue; + } + else if (!strcmp(cmd->seq[0][0], "jobs")) + { + afficher(&jobs); + continue; } - } - } - } + pid_t pidFils = fork(); - return EXIT_SUCCESS; + if (pidFils == -1) + { + fprintf(stderr, "ERROR: forking failed, %s\n", strerror(errno)); + exit(errno); + } + + if (pidFils == 0) + { // fils + int test = execvp(cmd->seq[0][0], cmd->seq[0]); + exit(errno); // si execlp échoue on exit avec une erreur + } + else // père + { + if (cmd->backgrounded) + { + ajouter(&jobs, pidFils, job_id++); + } + else + { + jmp_buf env; + setjmp(env); + + int codeTerm; + pid_t idFils = waitpid(pidFils, &codeTerm, 0); // on attend la fin de l'exec du fils + + if (idFils == -1) + { // si le wait fail + if (errno == 4) + { // todo : peut mieux faire ? + longjmp(env, 1); + } + else + { + fprintf(stderr, "ERROR: waiting for %d failed, (%d) %s\n", codeTerm, errno, strerror(errno)); + exit(errno); + } + } + + if (codeTerm) + { + fprintf(stderr, "ERROR: %d's execution failed, (%d) %s\n", pidFils, codeTerm, strerror(codeTerm)); + } + } + } + } + + return EXIT_SUCCESS; } \ No newline at end of file