From 5ce9477df663d616946edaf8a4366a53b48c94ec Mon Sep 17 00:00:00 2001 From: 10195501441 <10195501441@stu.ecnu.edu.com> Date: Wed, 17 Mar 2021 19:29:39 +0800 Subject: [PATCH] new test ver --- result.txt | 15 +-- yeeshell | Bin 27936 -> 22824 bytes yeeshell.c | 429 +++++++------------------------------------------------------ yeeshell.h | 91 +------------ 4 files changed, 51 insertions(+), 484 deletions(-) diff --git a/result.txt b/result.txt index 561402c..5c5a139 100755 --- a/result.txt +++ b/result.txt @@ -1,10 +1,5 @@ -total 56 -drwxr-xr-x 4 root root 120 Mar 16 23:39 . -dr-xr-x---. 14 root root 4096 Mar 16 23:39 .. -drwxr-xr-x 8 root root 201 Mar 16 22:49 .git --rw-r--r-- 1 root root 46 Mar 10 17:40 README.md --rwx------ 1 root root 0 Mar 16 23:39 result.txt -drwxr-xr-x 2 root root 64 Mar 16 11:27 .vscode --rwxr-xr-x 1 root root 27936 Mar 16 23:39 yeeshell --rw-r--r-- 1 root root 15053 Mar 16 23:38 yeeshell.c --rw-r--r-- 1 root root 4043 Mar 16 23:36 yeeshell.h +README.md +result.txt +yeeshell +yeeshell.c +yeeshell.h diff --git a/yeeshell b/yeeshell index c8a960270b7d27dae67a2010bdae5fef142c4545..ca41902a771b0234658659210a23799aa10b995e 100755 GIT binary patch literal 22824 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 Yq)e4tsm{bfA^XR-3XORV0|(3g2WSOKFaQ7m literal 27936 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 I$&nTR49UxSEdT%j diff --git a/yeeshell.c b/yeeshell.c index bed1ce3..1114bf2 100644 --- a/yeeshell.c +++ b/yeeshell.c @@ -15,18 +15,6 @@ char *history[CMDLINE_HISTORY_MAX_QUANTITY]; int cmdline_amount = 0; -/* if true, print additional output */ -int verbose = 0; - -/* next job ID to allocate */ -int nextjid = 1; - -/* environment variable */ -extern char **environ; - -/* The job list */ -struct job_t jobs[JOBS_MAX_QUANTITY]; - int main() { char *cmdline = NULL, *pwd = NULL; @@ -38,15 +26,6 @@ int main() history[i] = (char *)calloc(CMDLINE_MAX_SIZE, sizeof(char)); } - /* Install the signal handlers */ - Signal(SIGINT, sigint_handler); /* ctrl-c */ - Signal(SIGTSTP, sigtstp_handler); /* ctrl-z */ - Signal(SIGCHLD, sigchld_handler); /* Terminated or stopped child */ - Signal(SIGQUIT, sigquit_handler); - - /* initiate job list */ - initjobs(jobs); - /* execute the shell's read, parse and execution loop */ do { @@ -203,10 +182,6 @@ int execute(char *cmdline, char **args) redirect_filename = (char *)calloc(REDIRECT_FILENAME_MAX_SIZE, sizeof(char)); memset(redirect_args, NULL, sizeof(redirect_args)); - sigset_t mask_all, mask_prev; - sigprocmask(SIG_BLOCK, NULL, &mask_all); - sigaddset(&mask_all, SIGCHLD); - bg = parseline(cmdline, args); redirect_flag = check_redirect(args, redirect_filename, redirect_args); pipe_num = check_pipe(args, pipe_arg_1, pipe_arg_2); @@ -215,13 +190,10 @@ int execute(char *cmdline, char **args) { return 1; } - if (pipe_num == 0) + if (pipe_num == 0) /* no pipe */ { if (!built_in(args)) /* built-in cmd? */ { - /* Prevent child processes from ending between parent processes, that is, between addJob and deleteJob. */ - sigprocmask(SIG_BLOCK, &mask_all, &mask_prev); /* Shield SIGCHLD */ - if ((pid = fork()) == 0) /* Child process */ { if (redirect_flag == 1) /* redirect? */ @@ -237,14 +209,6 @@ int execute(char *cmdline, char **args) dup(fd); } - /* The child process inherits the parent's signal mask and will inherit it after exec, - so it needs to restore the signal mask before executing. */ - sigprocmask(SIG_SETMASK, &mask_prev, NULL); /* Child process, unblock SIGCHLD */ - - /* Set the pid of the current process to the group number of the process group it belongs to. */ - /* avoid being grouped with tsh */ - setpgid(0, 0); - if ((redirect_flag == 1) || (redirect_flag == 2)) { @@ -264,27 +228,17 @@ int execute(char *cmdline, char **args) } } } - else + else /* parent process */ { - if (bg) /* bg task */ + if (bg) { - addjob(jobs, pid, BG, cmdline); + signal(SIGCHLD, SIG_IGN); } - else /* fg task */ - { - addjob(jobs, pid, FG, cmdline); - } - - sigprocmask(SIG_SETMASK, &mask_prev, NULL); - - if (bg) /* Don't wait for background tasks to finish */ - { - printf("[%d](%d)%s", pid2jid(pid), pid, cmdline); - } - else /* Wait for foreground tasks to finish */ + else { - waitfg(pid); + waitpid(pid, NULL, 0); } + return 1; } } } @@ -292,7 +246,10 @@ int execute(char *cmdline, char **args) { int fds[2]; pid_t prog_1, prog_2; - sigprocmask(SIG_BLOCK, &mask_all, &mask_prev); + + printf("%s %s %s %s %s %s\n", pipe_arg_1[0], pipe_arg_1[1], pipe_arg_1[3], pipe_arg_1[4], pipe_arg_1[5]); + + printf("%s %s %s %s %s %s\n", pipe_arg_2[0], pipe_arg_2[1], pipe_arg_2[3], pipe_arg_2[4], pipe_arg_2[5]); if ((prog_1 = fork()) == 0) /* Child process 1 */ { @@ -300,16 +257,12 @@ int execute(char *cmdline, char **args) dup2(fds[1], 2); close(fds[0]); close(fds[1]); - - sigprocmask(SIG_SETMASK, &mask_prev, NULL); setpgid(0, 0); - if (execvp(pipe_arg_1[0], pipe_arg_1) <= 0) { printf("%s: Command not found\n", pipe_arg_1[0]); exit(0); } - _exit(127); } if ((prog_2 = fork()) == 0) /* Child process 1 */ @@ -317,23 +270,21 @@ int execute(char *cmdline, char **args) dup2(fds[0], 0); close(fds[0]); close(fds[1]); - - sigprocmask(SIG_SETMASK, &mask_prev, NULL); setpgid(0, 0); - if (execvp(pipe_arg_2[0], pipe_arg_2) <= 0) { printf("%s: Command not found\n", pipe_arg_2[0]); exit(0); } - _exit(127); } close(fds[0]); close(fds[1]); - waitfg(prog_1); - waitfg(prog_2); + wait(0); + wait(0); + + return 1; } return 1; } @@ -354,11 +305,16 @@ int built_in(char **args) } else if (!strcmp(args[0], "mytop")) { - return builtin_mytop(args); - } - else if (!strcmp(args[0], "jobs")) - { - return builtin_jobs(args); + int flag = builtin_mytop(); + if (flag == -1) + { + printf("yeeshell: unable to get memory info.\n"); + } + else if (flag == -2) + { + printf("yeeshell: unable to get CPU info.\n"); + } + return flag; } else { @@ -401,343 +357,44 @@ int builtin_history(char **args) return 1; } -int builtin_jobs(char **args) -{ - /* To prevent interruptions, block all signals. */ - sigset_t mask_all, mask_prev; - sigfillset(&mask_all); - sigprocmask(SIG_SETMASK, &mask_all, &mask_prev); - - for (int i = 0; i < JOBS_MAX_QUANTITY; i++) - { - if (jobs[i].pid != 0) - { - printf("[%d] (%d) ", jobs[i].jid, jobs[i].pid); - switch (jobs[i].state) - { - case BG: - printf("Running "); - break; - case FG: - printf("Foreground "); - break; - case ST: - printf("Stopped "); - break; - default: - printf("listjobs: Internal error: job[%d].state=%d ", - i, jobs[i].state); - } - printf("%s", jobs[i].cmdline); - } - } - - sigprocmask(SIG_SETMASK, &mask_prev, NULL); /* unclock */ - return 1; -} - -int builtin_mytop(char **args) +int builtin_mytop() { -} - -int do_bgfg(char **args) -{ - /* initialize variables */ - struct job_t *currentJob; - int jid; - pid_t pid; - sigset_t mask_all, mask_prev; - sigfillset(&mask_all); - - sigprocmask(SIG_SETMASK, &mask_all, &mask_prev); - - /* bg or fg has the argument? */ - if (args[1] == NULL) + int memory_flag = 0, CPU_flag = 0; + memory_flag = mytop_memory(); + CPU_flag = mytop_CPU(); + if (!memory_flag) { - printf("%s command requires PID or %%jobid argument\n", args[0]); - return 1; + return -1; } - /* if process by jid, gets the corresponding Job structure*/ - else if (args[1][0] == '%') + else if (!CPU_flag) { - jid = atoi(args[1][1]); - currentJob = getjobjid(jobs, jid); - if (currentJob == NULL) - { - printf("%%%d: No such job\n", jid); - return 1; - } - pid = currentJob->pid; + return -2; } - /* if process by pid, gets the corresponding Job structure */ else { - pid = atoi(args[1]); - currentJob = getjobpid(jobs, pid); - if (pid <= 0) - { - printf("%s: argument must be a PID or %%jobid\n", args[0]); - return 1; - } - currentJob = getjobpid(jobs, pid); - if (currentJob == NULL) - { - printf("(%d): No such process\n", pid); - return 1; - } - } - - /* bg or fg? */ - if (!strcmp(args[0], "bg")) /* if bg */ - { - currentJob->state = BG; - printf("[%d] (%d) %s", currentJob->jid, pid, currentJob->cmdline); - sigprocmask(SIG_SETMASK, &mask_prev, NULL); - kill(-pid, SIGCONT); /* send the SIGCONT to the pid */ - return 1; - } - else if (!strcmp(args[0], "fg")) /* if fg */ - { - currentJob->state = FG; - sigprocmask(SIG_SETMASK, &mask_prev, NULL); - kill(-pid, SIGCONT); /* send the SIGCONT to the pid */ - waitfg(currentJob->pid); /* Child process switched to FG, so wait for it to finish */ return 1; } - else if (!strcmp(args[0], "kill")) - { - sigprocmask(SIG_SETMASK, &mask_prev, NULL); - kill(-pid, SIGQUIT); - return 1; - } - return 1; -} - -void waitfg(pid_t pid) -{ - sigset_t m; - sigemptyset(&m); - while (pid == fgpid(jobs)) - { - /* Wake up when there is a signal to check whether the foreground process PID change, */ - /* change means that the foreground process is over. */ - sigsuspend(&m); - } - return; -} - -void initjobs(struct job_t *jobs) -{ - int i; - - for (i = 0; i < JOBS_MAX_QUANTITY; i++) - clearjob(&jobs[i]); -} - -int addjob(struct job_t *jobs, pid_t pid, int state, char *cmdline) -{ - int i; - - if (pid < 1) - return 0; - - for (i = 0; i < JOBS_MAX_QUANTITY; i++) - { - if (jobs[i].pid == 0) - { - jobs[i].pid = pid; - jobs[i].state = state; - jobs[i].jid = nextjid++; - if (nextjid > JOBS_MAX_QUANTITY) - nextjid = 1; - strcpy(jobs[i].cmdline, cmdline); - - if (verbose) - { - printf("Added job [%d] %d %s\n", jobs[i].jid, jobs[i].pid, jobs[i].cmdline); - } - return 1; - } - } - printf("Tried to create too many jobs\n"); - return 0; -} - -void listjobs(struct job_t *jobs) -{ - for (int i = 0; i < JOBS_MAX_QUANTITY; i++) - { - if (jobs[i].pid != 0) - { - printf("[%d] (%d) ", jobs[i].jid, jobs[i].pid); - switch (jobs[i].state) - { - case BG: - printf("Running "); - break; - case FG: - printf("Foreground "); - break; - case ST: - printf("Stopped "); - break; - default: - printf("listjobs: Internal error: job[%d].state=%d ", i, jobs[i].state); - } - printf("%s", jobs[i].cmdline); - } - } } -int deletejob(struct job_t *jobs, pid_t pid) +int mytop_memory() { - int i; + FILE *fp = NULL; + int pagesize; + long total = 0, free = 0, cached = 0; - if (pid < 1) - return 0; - - for (i = 0; i < JOBS_MAX_QUANTITY; i++) + if ((fp = fopen("/proc/meminfo", "r")) == NULL) { - if (jobs[i].pid == pid) - { - clearjob(&jobs[i]); - nextjid = maxjid(jobs) + 1; - return 1; - } - } - return 0; -} - -void clearjob(struct job_t *job) -{ - job->pid = 0; - job->jid = 0; - job->state = UNDF; - job->cmdline[0] = '\0'; -} - -int pid2jid(pid_t pid) -{ - int i; - - if (pid < 1) return 0; - for (i = 0; i < JOBS_MAX_QUANTITY; i++) - if (jobs[i].pid == pid) - { - return jobs[i].jid; - } - return 0; -} - -pid_t fgpid(struct job_t *jobs) -{ - for (int i = 0; i < JOBS_MAX_QUANTITY; i++) - if (jobs[i].state == FG) - return jobs[i].pid; - return 0; -} - -struct job_t *getjobpid(struct job_t *jobs, pid_t pid) -{ - int i; - - if (pid < 1) - return NULL; - for (i = 0; i < JOBS_MAX_QUANTITY; i++) - if (jobs[i].pid == pid) - return &jobs[i]; - return NULL; -} - -struct job_t *getjobjid(struct job_t *jobs, int jid) -{ - int i; - - if (jid < 1) - return NULL; - for (i = 0; i < JOBS_MAX_QUANTITY; i++) - if (jobs[i].jid == jid) - return &jobs[i]; - return NULL; -} - -int maxjid(struct job_t *jobs) -{ - int i, max = 0; - - for (i = 0; i < JOBS_MAX_QUANTITY; i++) - { - if (jobs[i].jid > max) - { - max = jobs[i].jid; - } } - return max; -} - -handler_t *Signal(int signum, handler_t *handler) -{ - struct sigaction action, old_action; - - action.sa_handler = handler; - sigemptyset(&action.sa_mask); /* block sigs of type being handled */ - action.sa_flags = SA_RESTART; /* restart syscalls if possible */ - - if (sigaction(signum, &action, &old_action) < 0) - fprintf(stdout, "%s: %s\n", 'Signal Error', strerror(errno)); - return (old_action.sa_handler); -} -void sigchld_handler(int signal) -{ - pid_t pid; - int status; - while ((pid = waitpid(-1, &status, WNOHANG | WUNTRACED)) > 0) - { - if (WIFEXITED(status)) /* Normal termination */ - { - deletejob(jobs, pid); - } - if (WIFSTOPPED(status)) /* Task suspension */ - { - struct job_t *job = getjobpid(jobs, pid); - int jid = pid2jid(pid); - printf("Job [%d] (%d) stopped by signal %d\n", jid, pid, WSTOPSIG(status)); - job->state = ST; - } - if (WIFSIGNALED(status)) /* Task terminated */ - { - int jid = pid2jid(pid); - printf("Job [%d] (%d) terminated by signal %d\n", jid, pid, WTERMSIG(status)); - deletejob(jobs, pid); - } - } - return; -} + fscanf(fp, "%u %lu %lu %lu", &pagesize, &total, &free, &cached); + fclose(fp); -void sigint_handler(int signal) -{ - pid_t pid = fgpid(jobs); - if (pid != 0) - { - kill(-pid, signal); - } - return; -} + printf("memmory(KBytes):\t%ld total\t%ld free\t%ld cached\n", (pagesize * total) / 1024, (pagesize * free) / 1024, (pagesize * cached) / 1024); -void sigtstp_handler(int signal) -{ - pid_t pid = fgpid(jobs); - if (pid > 0) - { - kill(-pid, signal); - } - return; + return 1; } -void sigquit_handler(int signal) +int mytop_CPU() { - printf("Terminating after receipt of SIGQUIT signal\n"); - exit(1); } \ No newline at end of file diff --git a/yeeshell.h b/yeeshell.h index eb16d4a..a26c1f8 100644 --- a/yeeshell.h +++ b/yeeshell.h @@ -2,33 +2,19 @@ #define CMDLINE_MAX_SIZE 1024 /* max length of a single command line */ #define ARGS_MAX_QUANTITY 128 /* max args on a command line */ -#define BUFFER_MAX_SIZE 64 /* max size of a buffer which contains parsed arguments */ +#define BUFFER_MAX_SIZE 64 /* max size of a buffer which contains parsed arguments */ #define CMDLINE_DIV ' \t\r\n\a' #define CMDLINE_HISTORY_MAX_QUANTITY 256 #define JOBS_MAX_QUANTITY 16 #define PATH_MAX_SIZE 256 #define LS_BUF_SIZE 1024 #define REDIRECT_FILENAME_MAX_SIZE 64 /* redirection filename */ -#define REDIRECT_ARG_MAX_SIZE 16 /* redirection argument */ - -#define UNDF 0 /* undefined */ -#define FG 1 /* running in foreground */ -#define BG 2 /* running in background */ -#define ST 3 /* stopped */ +#define REDIRECT_ARG_MAX_SIZE 16 /* redirection argument */ #define REDIRECT_NO 0 /* no redirection */ #define REDIRECT_OUT 1 /* redirect output */ #define REDIRECT_IN 2 /* redirect input */ -/* job_t - The job struct */ -struct job_t -{ - pid_t pid; /* job PID */ - int jid; /* job ID [1, 2, ...] */ - int state; /* UNDEF, BG, FG, or ST */ - char cmdline[CMDLINE_MAX_SIZE]; /* command line */ -}; - /* readline - Get the command line */ char *readline(); @@ -48,75 +34,4 @@ int execute(char *cmdline, char **args); int built_in(char **args); int builtin_cd(char **args); int builtin_history(char **args); -int builtin_jobs(char **args); -int builtin_mytop(char **args); - -/* do_bgfg - Execute background/foregroung tasks */ -int do_bgfg(char **args); - -/* waitfg - Wait foreground jobs to finish */ -void waitfg(pid_t pid); - -/* initjobs - Initialize the job list */ -void initjobs(struct job_t *jobs); - -/* addjob - Add jobs to joblist */ -int addjob(struct job_t *jobs, pid_t pid, int state, char *cmdline); - -/* listjobs - Print the job list */ -void listjobs(struct job_t *jobs); - -/* deletejob - Delete a job whose PID=pid from the job list */ -int deletejob(struct job_t *jobs, pid_t pid); - -/* clearjob - Clear the entries in a job struct */ -void clearjob(struct job_t *job); - -/* pide2jid - Map process ID to job ID*/ -int pid2jid(pid_t pid); - -/* fgpid - Return PID of current foreground job, 0 if no such job */ -pid_t fgpid(struct job_t *jobs); - -/* getjobpid - Find a job (by PID) on the job list */ -struct job_t *getjobpid(struct job_t *jobs, pid_t pid); - -/* getjobjid - Find a job (by JID) on the job list */ -struct job_t *getjobjid(struct job_t *jobs, int jid); - -/* maxjid - Returns largest allocated job ID */ -int maxjid(struct job_t *jobs); - -/* Signal - wrapper for the sigaction function */ -typedef void handler_t(int); -handler_t *Signal(int signum, handler_t *handler); - -/* - * sigchld_handler - The kernel sends a SIGCHLD to the shell whenever - * a child job terminates (becomes a zombie), or stops because it - * received a SIGSTOP or SIGTSTP signal. The handler reaps all - * available zombie children, but doesn't wait for any other - * currently running children to terminate. - */ -void sigchld_handler(int signal); - -/* - * sigint_handler - The kernel sends a SIGINT to the shell whenver the - * user types ctrl-c at the keyboard. Catch it and send it along - * to the foreground job. - */ -void sigint_handler(int signal); - -/* - * sigtstp_handler - The kernel sends a SIGTSTP to the shell whenever - * the user types ctrl-z at the keyboard. Catch it and suspend the - * foreground job by sending it a SIGTSTP. - */ - -void sigtstp_handler(int signal); - -/* - * sigquit_handler - The driver program can gracefully terminate the - * child shell by sending it a SIGQUIT signal. - */ -void sigquit_handler(int signal); \ No newline at end of file +int builtin_mytop(); \ No newline at end of file