返回值語義
| 返回值 | 含義 | POSIX 宏 |
| -1 | fork/exec 失敗,errno 指示原因 | — |
| >=0 | 子進程退出狀態,需用宏解析 | WIFEXITED、WEXITSTATUS |
標準檢查模式
int ret = system("TASKKILL /F /IM text.exe");
if (ret == -1) {
perror("system failed"); // 查看 errno
} else if (WIFEXITED(ret)) {
int exit_code = WEXITSTATUS(ret);
if (exit_code != 0) fprintf(stderr, "Command exited with %d\n", exit_code);
} else if (WIFSIGNALED(ret)) {
fprintf(stderr, "Killed by signal %d\n", WTERMSIG(ret));
}
Windows 特殊性
system() 返回命令的退出碼(cmd.exe 返回值)
- 無
WIFEXITED 等宏,直接判斷 ret != 0 即可
- 內建命令(如
dir、del)通常返回 0 表示成功
安全警示
- 命令注入:絕不拼接用戶輸入直接傳給
system()
- 性能:啟動 Shell 開銷大,高頻調用改用
exec 族/CreateProcess
- 可移植性:命令路徑、參數跨平台差異極大
現代替代方案
- C++17:
std::filesystem 文件操作
- Boost.Process /
popen 需要捕獲輸出
- 系統編程:
fork+execve (Linux) / CreateProcess (Windows)