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

          支持參數和后臺運行的shell

          Posted on 2007-08-28 15:37 ZelluX 閱讀(636) 評論(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;
          }


          主站蜘蛛池模板: 封丘县| 湖口县| 永泰县| 额尔古纳市| 汉沽区| 衢州市| 桦川县| 广德县| 荆州市| 阿鲁科尔沁旗| 清丰县| 蒲城县| 诸城市| 卫辉市| 宣城市| 九寨沟县| 图木舒克市| 山西省| 开平市| 垣曲县| 横峰县| 罗江县| 平昌县| 陇南市| 砀山县| 承德县| 内丘县| 永安市| 分宜县| 辽源市| 灌云县| 公主岭市| 颍上县| 安平县| 特克斯县| 兰州市| 蓝山县| 阿尔山市| 庄浪县| 宝鸡市| 永福县|