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;
          }


          主站蜘蛛池模板: 苏尼特左旗| 门源| 庆元县| 丘北县| 丰县| 永新县| 盐源县| 镇巴县| 六盘水市| 调兵山市| 抚顺县| 乌审旗| 南涧| 清远市| 长子县| 黔东| 马尔康县| 农安县| 云南省| 宝坻区| 昌都县| 宜丰县| 临夏市| 饶河县| 会理县| 香港 | 伊宁市| 玉环县| 南雄市| 漳州市| 繁峙县| 尼木县| 钟祥市| 雅安市| 塘沽区| 报价| 绥化市| 平乡县| 万全县| 玛沁县| 札达县|