int main(int argc,char* argv[]) { signal(SIGINT, sig_handler); signal(SIGTERM, sig_handler); signal(SIGQUIT, sig_handler); signal(SIGTSTP, sig_handler); int isExit = 0; do { char rawInput[255]; isExit = getUserInput(rawInput); if(isExit == 1) break; if (isExit == 0) tokenizeInput(rawInput); } while(isExit = 1); return 0; }
int main(int argc, char** argv) { pid_t pid; glob_t globbuf; while (1) { printf("$"); char buf[MAX_LINE]; char **argvv = tokenizeInput(buf); if (strcmp(argvv[0], "exit") == 0) { kill(pid, SIGKILL); exit(1); } pid = fork(); if (pid < 0) { fprintf(stderr, "Fork failed"); exit(1); } else if (pid == 0) { // child // backup stdout, stdin int stdin_save, stdout_save; // exec, redirecting streams as necessary if (is_redirect_in) { stdin_save = dup(STDIN_FILENO); freopen(redirect_stream, "r", stdin); execvp(argvv[0], argvv); dup2(stdin_save, STDIN_FILENO); exit(1); } else if (is_redirect_out) { stdout_save = dup(STDOUT_FILENO); freopen(redirect_stream, "w", stdout); execvp(argvv[0], argvv); dup2(stdout_save, STDOUT_FILENO); exit(1); } else if (has_wildcard) { // usage as detailed in `man glob` globbuf.gl_offs = argv_count - 1; // the GLOB_DOOFFS allocates gl_offs for us to merge glob(wildcard_expr, GLOB_DOOFFS, NULL, &globbuf); // merge the existing argvv array int i; for (i = 0; i < argv_count - 1; ++i) { globbuf.gl_pathv[i] = argvv[i]; } execvp(argvv[0], globbuf.gl_pathv); exit(1); } else { execvp(argvv[0], argvv); exit(1); } } else { // parent if (is_fg) { wait(NULL); } } } return 0; }