|
- #include "csapp.h"
- #define MAXARGS 128
- typedef void (*sighandler_t)(int);
- void eval (char *cmdline);
- int parseline (char *buf, char **argv);
- int builtin_commond (char **argv);
- void *handler_int (int sig);
- void *handler_tstp (int sig);
- void * handler_chld (int sig);
- int main(int argc, char *argv, char *envp[])
- {
- Signal (SIGCHLD, handler_chld);
- char cmdline[MAXARGS];
- while (1){
- printf(">");
- Fgets (cmdline, MAXLINE, stdin);
- if (feof(stdin))
- exit(0);
- eval (cmdline);
- }
- return 0;
- }
- void eval (char *cmdline)
- {
- char *argv[MAXARGS];
- char buf[MAXLINE];
- int bg;
- pid_t pid;
- strcpy (buf, cmdline);
- bg = parseline (buf, argv);
- if (argv[0] == NULL)
- return ; //Ignore empty lines
- if (!builtin_commond(argv)) {
- Signal (SIGINT, handler_int);
- Signal (SIGTSTP, handler_tstp);
- if ((pid = Fork()) == 0) {
- if (execve(argv[0], argv, environ) < 0){
- printf("%s: Command not found.\n", argv[0]);
- exit (0);
- }
- }
- if (!bg) {
- int status;
- if (waitpid(pid, &status, 0) < 0)
- unix_error("waitfg: waitpid error");
- }
- else
- printf ("%d %s", pid, cmdline);
- }
- return ;
- }
- int builtin_commond (char **argv)
- {
- if (!strcmp(argv[0], "quit"))
- exit(0);
- if (!strcmp (argv[0], "&"))
- return 1;
- return 0;
- }
- int parseline (char *buf, char **argv)
- {
- char *delim;
- int argc;
- int bg;
- buf[strlen(buf)-1] = ' ';
- while (*buf && (*buf == ' '))
- buf++;
- argc = 0;
- while ((delim = strchr(buf, ' '))){
- argv[argc++] = buf;
- *delim = '\0';
- buf = delim +1;
- while (*buf && (*buf == ' '))
- buf++;
- }
- argv[argc] = NULL;
- if (argc == 0)
- return 0;
- if ((bg = (*argv[argc-1] == '&')) != 0)
- argv[--argc] = NULL;
- return bg;
- }
- void *handler_int (int sig)
- {
- return ;
- }
- void *handler_tstp (int sig)
- {
- return;
- }
- void * handler_chld (int sig)
- {
- pid_t pid;
- if ((pid = waitpid (-1, NULL, 0)) > 0)
- printf ("job %d has been quit\n",pid);
- if (errno != ECHILD)
- unix_error("waitpid error")
- return 0;
- }
复制代码
求高人指点啊~ |
|