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 &"); // 後台運行
remove() 刪除文件、mkdir() 創建目錄、fork()+exec() 啟動子進程if (system(cmd) == -1) perror("system");cmd.exe 8191 字符限制
#ifdef _WIN32
system("cls");
#else
system("clear");
#endif
system("cd /tmp") 改變工作目錄 → ✅ 只影響子進程,父進程目錄不變,用 chdir()system("set VAR=val") 設置環境變量 → ✅ 同理,用 setenv()/putenv()system() 是異步 → ✅ 默認同步阻塞,直到命令結束(Windows start/Linux & 可異步)