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

          模仿命令行shell的簡單程序

          Posted on 2007-08-04 00:20 ZelluX 閱讀(575) 評論(0)  編輯  收藏 所屬分類: C/C++
          APUE上的例程,稍微改了下,在進程開始和結束的時候會分別顯示當前的PID和退出狀態。
          不支持參數
          1. fgets命令從標準輸入讀入命令,當鍵入文件結束字符(通常是Ctrl+D)時進程結束
          2. 以\0替換輸入命令的最后一個字符,即去掉換行符,使得execlp能夠處理
          3. fork函數創建一個新進程,對父進程返回新的子進程的非負PID,對子進程返回0
          4. 在子進程中,調用execlp以執行從標準輸入讀入的命令。fork和exec的組合產生了一個新進程
          5. 新的子進程開始執行后,父進程等待子進程的終止,這一要求由waitpid實現
          6. 執行這個程序后還可以在這個簡易shell中創建新的自身的進程

          #include <sys/types.h>
          #include 
          <sys/wait.h>
          #include 
          "ourhdr.h"

          int main(void)
          {
              
          char    buf[MAXLINE];
              pid_t   pid;
              
          int     status;

              printf(
          "%% ");
              
          while (fgets(buf, MAXLINE, stdin) != NULL)
              {
                  buf [strlen(buf) 
          - 1= 0;

                  
          if ( (pid = fork()) < 0)
                      err_sys(
          "fork error");
                  
          else if (pid == 0)
                  {
                      execlp(buf, buf, (
          char *0);
                      err_ret(
          "couldn't execute: %s", buf);
                      exit(
          127);
                  }

                  printf(
          "*** %d ***\n", status);

                  
          /* parent */
                  
          if ( (pid = waitpid(pid, &status, 0)) < 0)
                      err_sys(
          "waitpid error");

                  printf(
          "*** %d ***\n", pid);
                  printf(
          "%% ");
              }
              exit(
          0);
          }

          主站蜘蛛池模板: 龙里县| 龙海市| 四平市| 永靖县| 吉木乃县| 西和县| 额济纳旗| 子长县| 中阳县| 罗山县| 雷山县| 鸡泽县| 阜宁县| 商水县| 兴山县| 永春县| 镇沅| 望江县| 金川县| 仙桃市| 兴山县| 东山县| 西丰县| 房产| 达尔| 凤庆县| 德化县| 青岛市| 都兰县| 乌兰县| 高密市| 漾濞| 沾化县| 木兰县| 洪雅县| 安平县| 遂平县| 辽源市| 庆元县| 屏南县| 盐边县|