#pragma once #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 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 UNDF 0 /* undefined */ #define FG 1 /* running in foreground */ #define BG 2 /* running in background */ #define ST 3 /* stopped */ #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(); /* parseline - Evaluate the command line that the user has just typed in */ int parseline(char *cmdline, char **args); /* check_redirect - check if the command contains redirection */ int check_redirect(char **args, char *redirect_filename, char **redirect_args); /* execute - Execute the command line */ int execute(char *cmdline, char **args); /* builtin functions - Handle built-in command */ 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);