2017-02-16 26 views
1

我開始使用Linux內部概念。在以下程序中,爲什麼不執行第二個printfexecl在Linux中的功能c

#include <unistd.h> 
#include <stdio.h> 

int main(void) { 
    printf("Before execl"); 
    execl("/bin/ls", "ls", "-l", NULL); 
    printf("After execl"); 
    return 0; 
} 

回答

2

第二printf沒有執行,因爲execl接管您的應用程序的進程,並與新指定的進程來替換它。根據手冊頁:

exec()系列函數將當前過程映像替換爲新的過程映像。本手冊頁中描述的功能是execve(2)的前端。 (見的execve(2)關於更換當前的進程映像的更多詳細信息的手冊頁。)

而且從execve(2)手冊頁:

的execve()成功不返回,並且調用過程的文本,數據,bss和堆棧被加載的程序覆蓋。如果當前程序正在被捕獲,一個成功的execve()後會向它發送一個SIGTRAP。

如果你希望你的程序繼續執行,顯示第二printf,你必須調用execl(或exec系列中的任何功能),一個fork子裏面。 C標準庫函數system()就是這樣做的,你可以查看源代碼here