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

C語言system函數調用DOS命令與CMD直接執行的區別

     編輯:C 語言問答

直接結論

system() 執行命令比 CMD 直接執行慢,但實質效果相同。差異源於進程創建開銷。

詳細對比

維度system("cmd")CMD 直接執行
進程模型當前進程 → fork() → 子進程執行 shell → shell 再啟動目標程序CMD 進程直接啟動目標程序
Shell 層級經過 cmd.exe /c (Windows) 或 /bin/sh -c (Linux)CMD 本身就是 Shell
環境繼承繼承調用者環境變量、文件描述符、工作目錄CMD 當前會話環境
返回值返回 shell 退出碼(或 -1 失敗)直接看到程序輸出/退出碼
性能開銷額外 fork/exec + Shell 初始化(毫秒級)無額外開銷
安全性命令注入風險(拼接用戶輸入時)用戶手動輸入,風險較低

代碼示例


// Windows
system("dir");           // 列出目錄
system("notepad.exe");   // 啟動記事本(異步,不等待)
system("pause");         // 常見「按任意鍵繼續」

// Linux
system("ls -l");
system("./myapp &");     // 後台運行

最佳實踐建議

  1. 能用庫函數/系統調用別用 system:如 remove() 刪除文件、mkdir() 創建目錄、fork()+exec() 啟動子進程
  2. 必須用 system 時:
    • 命令字符串硬編碼,絕不拼接用戶輸入
    • 檢查返回值:if (system(cmd) == -1) perror("system");
    • Windows 下長命令可能超過 cmd.exe 8191 字符限制
  3. 跨平台寫法:
    
    #ifdef _WIN32
        system("cls");
    #else
        system("clear");
    #endif
    

常見誤區

  • ❌ system("cd /tmp") 改變工作目錄 → ✅ 只影響子進程,父進程目錄不變,用 chdir()
  • ❌ system("set VAR=val") 設置環境變量 → ✅ 同理,用 setenv()/putenv()
  • ❌ 以為 system() 是異步 → ✅ 默認同步阻塞,直到命令結束(Windows start/Linux & 可異步)
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved