LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 1327|回复: 1

csapp习题写一个shell,不知啥原因无法处理SIGTSTP信号

[复制链接]
发表于 2011-3-25 22:22:22 | 显示全部楼层 |阅读模式

  1. #include "csapp.h"
  2. #define MAXARGS 128
  3. typedef void (*sighandler_t)(int);
  4. void eval (char *cmdline);
  5. int parseline (char *buf, char **argv);
  6. int builtin_commond (char **argv);
  7. void *handler_int (int sig);
  8. void *handler_tstp (int sig);
  9. void * handler_chld (int sig);
  10. int main(int argc, char *argv, char *envp[])
  11. {
  12.     Signal (SIGCHLD, handler_chld);
  13.     char cmdline[MAXARGS];
  14.     while (1){
  15.         printf(">");
  16.         Fgets (cmdline, MAXLINE, stdin);
  17.         if (feof(stdin))
  18.             exit(0);

  19.         eval (cmdline);
  20.     }
  21.     return 0;
  22. }

  23. void eval (char *cmdline)
  24. {
  25.     char *argv[MAXARGS];
  26.     char buf[MAXLINE];
  27.     int bg;
  28.     pid_t pid;

  29.     strcpy (buf, cmdline);
  30.     bg = parseline (buf, argv);
  31.     if (argv[0] == NULL)
  32.         return ; //Ignore empty lines

  33.     if (!builtin_commond(argv)) {
  34.         Signal (SIGINT, handler_int);
  35.         Signal (SIGTSTP, handler_tstp);

  36.         if ((pid = Fork()) == 0) {
  37.             if (execve(argv[0], argv, environ) < 0){
  38.                 printf("%s: Command not found.\n", argv[0]);
  39.                 exit (0);
  40.             }
  41.         }
  42.         if (!bg) {

  43.             int status;
  44.             if (waitpid(pid, &status, 0) < 0)
  45.                 unix_error("waitfg: waitpid error");
  46.         }
  47.         else
  48.             printf ("%d %s", pid, cmdline);
  49.     }
  50.     return ;
  51. }

  52. int builtin_commond (char **argv)
  53. {
  54.     if (!strcmp(argv[0], "quit"))
  55.         exit(0);
  56.     if (!strcmp (argv[0], "&"))
  57.         return 1;
  58.     return 0;
  59. }

  60. int parseline (char *buf, char **argv)
  61. {
  62.     char *delim;
  63.     int argc;

  64.     int bg;

  65.     buf[strlen(buf)-1] = ' ';
  66.     while (*buf && (*buf == ' '))
  67.         buf++;

  68.     argc = 0;
  69.     while ((delim = strchr(buf, ' '))){
  70.         argv[argc++] = buf;
  71.         *delim = '\0';
  72.         buf = delim +1;
  73.         while (*buf && (*buf == ' '))
  74.             buf++;
  75.     }
  76.     argv[argc] = NULL;
  77.     if (argc == 0)
  78.         return 0;
  79.     if ((bg = (*argv[argc-1] == '&')) != 0)
  80.         argv[--argc] = NULL;
  81.     return bg;
  82. }
  83. void *handler_int (int sig)
  84. {

  85.     return ;
  86. }

  87. void *handler_tstp (int sig)
  88. {
  89.     return;
  90. }

  91. void * handler_chld (int sig)
  92. {
  93.     pid_t pid;
  94.     if ((pid = waitpid (-1, NULL, 0)) > 0)
  95.         printf ("job %d has been quit\n",pid);
  96.     if (errno != ECHILD)
  97.         unix_error("waitpid error")
  98.     return 0;

  99. }
复制代码

求高人指点啊~
发表于 2011-3-28 15:19:09 | 显示全部楼层
怎么不发处理?我试了试可以收到信号,不知道你想怎么处理这个信号?
是在子进程中处理而shell忽略吗?
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表