linux下c語言程式設計exec函式使用

2021-07-12 02:52:11 字數 2065 閱讀 2270

exec用被執行的程式完全替換呼叫它的程式的影像。fork建立乙個新的程序就產生了乙個新的pid,exec啟動乙個新程式,替換原有的程序,因此這個新的被exec執行的程序的pid不會改變,和呼叫exec函式的程序一樣。

下面來看下exec函式族:

#include std.h>

int execl(const char *path, const char *arg, ...);

int execlp(const char *file, const char *arg, ...);

int execle(const char *path, const char *arg, ..., char *const envp);

int execv(const char *path, char *const argv);

int execvp(const char *file, char *const argv);

int execve(const char *path, char *const argv, char *const envp);

exec函式族裝入並執行程式pathname,並將引數arg0(arg1,arg2,argv,envp)傳遞給子程式,出錯返回-1。在exec函式族中,字尾l、v、p、e新增到exec後,所指定的函式將具有某種操作能力有字尾:

其中只有execve是真正意義上的系統呼叫,其它都是在此基礎上經過包裝的庫函式。

我們來看下面的乙個例項:

#include #include #include #include int main(int argc,char *argv,char *envp)

; if(fork()==0)

}if(fork()==0)

} if(fork()==0)

}if(fork()==0)

}if(fork()==0)

}if(fork()==0)

}return 0;

}

程式裡呼叫了ls這個linux常用的系統命令。

由於各個子程序執行的順序無法控制,所以有可能出現乙個比較混亂的輸出--各子程序列印的結果交雜在一起,而不是嚴格按照程式中列出的次序。

編譯並執行:

下面我們來分析下所寫的程式。

其實我們留心看一下這6個函式,可以發現前3個函式都是以execl開頭的,後3個都是以execv開頭的。

首先來比較前兩個函式execv和execl。execv開頭的函式是把引數以"char *argv"這樣的形式傳遞命令列引數。而execl開頭的函式採用了我們更容易習慣的方式,把引數乙個乙個列出來,然後以乙個null表示結束,也可以寫成(char *)0。

其次緊跟著的2個以p結尾的函式execlp和execvp。與其他幾個函式相比,除execlp和execvp之外的4個函式都要求,它們的第1個引數path必須是乙個完整的路徑,如"/bin/ls";而execlp和execvp的第1個引數file可以簡單到僅僅是乙個檔名,如"ls",這兩個函式可以自動到環境變數path制定的目錄裡去尋找。

最後兩個函式execle和execve,都使用了char *envp來傳遞環境變數。在全部6個函式中,只有execle和execve需要傳遞環境變數,其它的4個函式都沒有這個引數,這並不意味著它們不傳遞環境變數,這4個函式將把預設的環境變數不做任何修改地傳給被執行的應用程式。而execle和execve會用指定的環境變數去替代預設的那些。

最後要強調一點,大家在平時的程式設計中,如果用到了exec函式族,一定記得要加錯誤判斷語句。因為與其他系統呼叫比起來,exec很容易受傷,被執行檔案的位置,許可權等很多因素都能導致該呼叫的失敗。最常見的錯誤是:

1. 找不到檔案或路徑,此時errno被設定為enoent;

2. 陣列argv和envp忘記用null結束,此時errno被設定為efault;

3. 沒有對要執行檔案的執行許可權,此時errno被設定為eacces。

Linux下C語言程式設計

include include include include define max 10pthread t thread 2 pthread mutex t mut int number 0 i void thread1 printf thread1 主函式在等我完成任務嗎?n pthread e...

Linux 下C語言程式設計

linux 下c語言程式設計 1.程式設計的概念和理解 1.1程式編譯的過程 在這一操作中,程式完成了複雜的過程。乙個程式的編譯,需要完成詞法分析 語法分析 中間 生成 優化 目標 生成。l 詞法分析 指的是對由字元組成的單詞進行處理,從左至右逐個字元地對源程式進行掃瞄,產生乙個個單詞符號。然後把字...

Linux下C語言程式設計概述

linux下的c語言程式設計與在其他環境中的c程式設計一樣,主要涉及到編輯器 編譯鏈結器 偵錯程式及專案管理工具。本篇內容屬於嵌入式學院 嵌入式工程師職業培訓班 一期課程中linux作業系統中的部分內容,這裡我們先對這4種工具進行一下簡單介紹。1 編輯器 linux下的編輯器就如windows下的w...