首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> 關於C語言

C語言實作簡易 Shell:命令解析、內建命令與進程創建框架

     編輯:關於C語言

C語言實作簡易 Shell:命令解析、內建命令與進程創建框架

Shell 核心循環:提示 → 讀取 → 解析 → 執行 → 等待。

極簡框架代碼

#include <stdio.h>
#include <string.h>
#include <unistd.h>
#include <sys/wait.h>

#define MAX_LINE 1024
#define MAX_ARGS 64

int main() {
    char line[MAX_LINE];
    char *args[MAX_ARGS];
    while (1) {
        printf("|-> ");                    // 提示符
        if (!fgets(line, MAX_LINE, stdin)) break;
        line[strcspn(line, "\n")] = 0; // 去換行

        // 簡易解析:按空格分割
        int argc = 0;
        char *tok = strtok(line, " ");
        while (tok && argc < MAX_ARGS-1) {
            args[argc++] = tok;
            tok = strtok(NULL, " ");
        }
        args[argc] = NULL;

        // 內建命令
        if (argc == 0) continue;
        if (strcmp(args[0], "exit") == 0) break;
        if (strcmp(args[0], "cd") == 0) { chdir(args[1] ? args[1] : getenv("HOME")); continue; }

        // 外部命令:fork + exec
        pid_t pid = fork();
        if (pid == 0) { execvp(args[0], args); perror("exec"); _exit(1); }
        else if (pid > 0) waitpid(pid, NULL, 0);
        else perror("fork");
    }
    return 0;
}

關鍵點解析

  • fgets 讀整行,支援含空格參數(需更完善的解析器處理引號/轉義)。
  • fork() 複製進程,子進程 execvp() 替換映像執行命令,父進程 waitpid() 回收避免殭屍。
  • 內建命令(cd、exit、pwd)必須在 Shell 進程內執行,不能 fork。

擴展路線圖

  1. 管道 |:pipe() + 多 fork 重定向 stdin/stdout。
  2. 重定向 > <:dup2() 替換文件描述符。
  3. 後台執行 &:父進程不 wait,設置 SIGCHLD 處理器。
  4. 命令歷史/補全:readline 庫或自行維護歷史陣列。

運行示例

|-> ls
main.c  shell.c  test.txt
|-> cd ..
|-> pwd
/home/user
|-> exit
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved