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

Linux C system() 調用子程序失敗:路徑未加絕對路徑導致找不到可執行文件

     編輯:程式設計綜合問答

問題代碼

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() vs fork()+exec()

特性system()fork()+exec()
簡單度高(一行)低(需錯誤處理、等待)
Shell 依賴是(啟動 sh)否(直接加載 ELF)
參數注入風險高(命令拼接)低(argv 數組)
性能較低較高
獲取子進程 PID困難直接獲得

建議

  • 簡單腳本調用、無安全敏感參數:system(絕對路徑) 可接受。
  • 生產級服務、高頻調用、需精細控制:改用 fork() + execv() 並處理 SIGCHLD、waitpid()。
  • 無論哪種,**絕對路徑**是避免「找不到程序」的關鍵。

總結

Linux C system() 調用子程序報找不到,**必須傳入絕對路徑**。system() 走 Shell 依賴 PATH,相對路徑/程序名僅在 PATH 目錄下生效。生產環境建議遷移至 fork+exec 並嚴格校驗參數。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved