From 29c97447092f25eec3fd6b60e859e5d962cc3687 Mon Sep 17 00:00:00 2001 From: kh06089 <kh06089@ajou.ac.kr> Date: Sun, 6 May 2018 22:25:31 +0900 Subject: [PATCH] backgroud --- src/built_in.c | 17 +++++++++++----- src/commands.c | 47 +++++++++++++++++++++++++------------------ src/main.c | 8 ++++---- src/signal_handlers.c | 3 ++- 4 files changed, 45 insertions(+), 30 deletions(-) diff --git a/src/built_in.c b/src/built_in.c index 848b6f0..1644fdb 100644 --- a/src/built_in.c +++ b/src/built_in.c @@ -37,13 +37,20 @@ int do_fg(int argc, char** argv) { if (!validate_fg_argv(argc, argv)) return -1; - int pid = waitpid(0,0,0); + int pid; + int stat; - if(pid == -1) - printf("Current: no such job\n"); - + pid = fork(); + waitpid(pid, &stat, 0); + + if(WIFEXITED(stat)) + { + printf("%d done", pid); + } else - printf("%d done\n", pid); + { + printf("%d running", pid); + } return 0; } diff --git a/src/commands.c b/src/commands.c index 55bcd9c..eea613d 100644 --- a/src/commands.c +++ b/src/commands.c @@ -59,30 +59,37 @@ int evaluate_command(int n_commands, struct single_command (*commands)[512]) } else if (strcmp(com->argv[0], "exit") == 0) { return 1; } - else { - - pid_t pid; - pid = fork(); - - switch(pid) + else { - case -1 : - //printf("fail\n"); - - case 0 : - execv(com->argv[0], com->argv); - fprintf(stderr, "%s: command not found\n", com->argv[0]); - return -1; - default : - wait((int*)0); - //printf("complete\n"); - return -1; + pid_t pid; + pid = fork(); + if(pid<0) + printf("FAIL \n"); + else if(pid==0) + { + if(strcmp(com->argv[0], "ls")==0 || strcmp(com->argv[0], "cat")==0) + { + char path[]= "/bin/"; + strcat(path, com->argv[0]); + com->argv[0]=path; + execv(com->argv[0], com->argv); + } + else if(strcmp(com->argv[0], "vim")==0) + { + char path[]="/usr/bin/"; + strcat(path, com->argv[0]); + com->argv[0]=path; + execv(com->argv[0], com->argv); + } + else + execv(com->argv[0], com->argv); + } + else + wait(&pid); } - } - } - return 0; + } } void free_commands(int n_commands, struct single_command (*commands)[512]) diff --git a/src/main.c b/src/main.c index de5e529..23cc7d1 100644 --- a/src/main.c +++ b/src/main.c @@ -12,20 +12,20 @@ int main() { char buf[8096]; - signal(SIGINT, catch_sigint); - signal(SIGTSTP, catch_sigtstp); + catch_sigint(SIGINT); + catch_sigtstp(SIGTSTP); while (1) { fgets(buf, 8096, stdin); - struct single_command commands[512]; + struct single_command commands[512]; //argv int n_commands = 0; mysh_parse_command(buf, &n_commands, &commands); int ret = evaluate_command(n_commands, &commands); free_commands(n_commands, &commands); - n_commands = 0; + n_commands = 0; //argc if (ret == 1) { break; diff --git a/src/signal_handlers.c b/src/signal_handlers.c index a599b8a..8e34122 100644 --- a/src/signal_handlers.c +++ b/src/signal_handlers.c @@ -5,10 +5,11 @@ void catch_sigint(int signalNo) { signal(signalNo, SIG_IGN); + return ; } void catch_sigtstp(int signalNo) { signal(signalNo, SIG_IGN); - + return ; } -- GitLab