char mat[128] = "dataProcess"; // 僅程序名
system(mat); // 報錯:找不到命令
system() 通過 sh -c 執行命令,**依賴 PATH 環境變量查找可執行文件**。若子程序不在 PATH 目錄下(如 /usr/bin, /usr/local/bin),Shell 會報「找不到命令」。
char mat[128] = "/home/user/project/dataProcess/dataProcess"; // 絕對路徑
system(mat);
或在代碼中構建:
snprintf(mat, sizeof(mat), "%s/dataProcess", getenv("HOME")); // 視部署位置而定
| 特性 | system() | fork()+exec() |
|---|---|---|
| 簡單度 | 高(一行) | 低(需錯誤處理、等待) |
| Shell 依賴 | 是(啟動 sh) | 否(直接加載 ELF) |
| 參數注入風險 | 高(命令拼接) | 低(argv 數組) |
| 性能 | 較低 | 較高 |
| 獲取子進程 PID | 困難 | 直接獲得 |
system(絕對路徑) 可接受。fork() + execv() 並處理 SIGCHLD、waitpid()。Linux C system() 調用子程序報找不到,**必須傳入絕對路徑**。system() 走 Shell 依賴 PATH,相對路徑/程序名僅在 PATH 目錄下生效。生產環境建議遷移至 fork+exec 並嚴格校驗參數。