posts - 403, comments - 310, trackbacks - 0, articles - 7
            BlogJava :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理

          支持參數和后臺運行的shell

          Posted on 2007-08-28 15:37 ZelluX 閱讀(640) 評論(0)  編輯  收藏 所屬分類: C/C++
          CSAPP上的例子,但是書中的源碼有問題,修改后的版本:
          #include "csapp.h"
          #define MAXARGS 128

          void eval(char *cmdline);
          int parseline(char *buf, char **argv);
          int buildin_command(char **argv);

          int main()
          {
              
          char cmdline[MAXLINE];

              
          while (1)
              {
                  printf(
          "");
                  Fgets(cmdline, MAXLINE, stdin);
                  
          if (feof(stdin))
                      exit(
          0);

                  eval(cmdline);
              }
          }

          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;

              
          if (!builtin_command(argv))
              {
                  
          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_command(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 1;

              
          if ((bg = (*argv[argc - 1== '&')) != 0)
                  argv[
          --argc] = NULL;

              
          return bg;
          }


          主站蜘蛛池模板: 莲花县| 枣庄市| 化隆| 微山县| 郑州市| 屏东县| 萨迦县| 通州市| 广东省| 盐源县| 牙克石市| 木兰县| 会同县| 大厂| 大石桥市| 合肥市| 武汉市| 太和县| 将乐县| 界首市| 婺源县| 仙居县| 万荣县| 太谷县| 张掖市| 丹巴县| 高青县| 岢岚县| 尉犁县| 青州市| 湘西| 宜黄县| 武威市| 普陀区| 会泽县| 高阳县| 东宁县| 邓州市| 天峨县| 铜川市| 沿河|