Windows XP Windows 7 Windows 2003 Windows Vista Windows 綜合教學 Linux 系統教學
Windows 10 Windows 8 Windows 2008 Windows NT Windows Server 電腦軟體教學
您现在的位置: Windows教程網 >> Windows教程 >  >> Linux 系統教學 >> Linux 教學

Linux execlp 系統調用使用教程與實例詳解

編輯:Linux 教學

函數原型

#include 
int execlp(const char *file, const char *arg, ... /* (char *)NULL */);

核心特性

  • PATH 搜尋:自動從環境變數 `PATH` 指定的目錄依序查找可執行文件 `file`,無需完整路徑。
  • 參數列表:可變參數構建新程式的 `argv[]`,**第一個參數慣例為程式名** (即 `argv[0]`),**最後必須以 `(char *)NULL` 結束**。
  • 不返回:成功時當前進程映像被新程式完全替換,**不會返回**;失敗返回 -1,錯誤碼存於 `errno`。
  • 繼承屬性:進程 ID、父進程 ID、文件描述符表 (除設 `FD_CLOEXEC`)、信號屏蔽集、當前工作目錄、用戶/組 ID 等均保留。

參數構建範例

// 相當於 shell 執行:ls -al /home
execlp("ls", "ls", "-al", "/home", (char *)NULL);

// 相當於:grep -r "pattern" /var/log
execlp("grep", "grep", "-r", "pattern", "/var/log", (char *)NULL);

常見錯誤:忘記結束的 `NULL`、參數順序錯誤、將選項與值合併為一個字串 (如 `"-al /home"`)。

完整示例程式

#include 
#include 
#include 
#include 
#include 

int main(void) {
    printf("PID %d: 準備執行 ls -al /tmp\n", getpid());
    
    // 使用 execlp 執行 ls
    execlp("ls", "ls", "-al", "/tmp", (char *)NULL);
    
    // 只有失敗時才會執行到這裡
    fprintf(stderr, "execlp 失敗: %s\n", strerror(errno));
    return EXIT_FAILURE;
}

編譯與執行

gcc execlp_demo.c -o execlp_demo
./execlp_demo

預期輸出

PID 12345: 準備執行 ls -al /tmp
total 12
drwxrwxrwt  3 root root 4096 Jan 1 10:00 .
drwxr-xr-x 18 root root 4096 Jan 1 09:00 ..
-rw-r--r--  1 user user  100 Jan 1 10:00 foo.txt
drwx------  2 user user 4096 Jan 1 10:00 ssh-xyz123
# 程式結束,不會返回原進程繼續執行

exec 族函數對比表

函數參數形式PATH 搜尋環境變數典型用途
execl列表 (arg0, arg1..., NULL)否 (需完整路徑)繼承路徑固定的內部命令
execlp列表是繼承用戶輸入命令名、PATH 環境
execle列表 + envp[]否**指定新環境**需控制環境變數
execvargv[] 陣列否繼承參數動態構建 (陣列)
execvpargv[] 陣列是繼承參數動態 + PATH 搜尋
execvpeargv[] + envp[]是**指定新環境**完全控制參數與環境

經典組合:fork + exec

pid_t pid = fork();
if (pid == 0) {              // 子進程
    execlp("ls", "ls", "-l", (char *)NULL);
    perror("execlp");        // 失敗才執行
    _exit(EXIT_FAILURE);
} else if (pid > 0) {        // 父進程
    waitpid(pid, NULL, 0);   // 等待子進程結束
    printf("子進程已結束,父進程繼續\n");
} else {
    perror("fork");
}

此模式實現「父進程繼續運行,子進程執行新程式」的並發邏輯,是 Shell、服務管理器、任務調度器的基石。

錯誤處理與調試

errno宏原因對策
ENOENTNo such file or directoryPATH 中找不到可執行文件確認命令拼寫、安裝套件、PATH 設定
EACCESPermission denied文件無執行權限`chmod +x` 或檢查掛載選項 noexec
ENOMEMOut of memory內核無法分配新進程映像檢查內存、ulimit -v
E2BIGArgument list too long參數+環境變數總長超限縮減參數、環境變數

結語

`execlp` 以「PATH 搜尋 + 列表參數 + 進程映像替換」三大特性,成為實現命令執行、腳本解釋器、插件加載的核心系統調用。掌握 `fork + exec` 模式與參數構建規範,是 Linux 系統編程進階的必經之路。

Copyright © Windows教程網 All Rights Reserved