exec()函數(shù)在C++中的應(yīng)用及其用法
前言
fork 函數(shù)之后,如果想要把子進(jìn)程換成一個(gè)我想要執(zhí)行的進(jìn)程,這時(shí),就不得不使用 exec()函數(shù)了,這也是 fork()的意義所在。當(dāng)然,exec系列的函數(shù)也可以將當(dāng)前進(jìn)程替換掉,不一定非要 fork()一個(gè)子進(jìn)程。常見(jiàn)的 fork()調(diào)用例子有很多,比如從 wechat 發(fā)起一個(gè)語(yǔ)音電話、從 bash 或者zsh執(zhí)行一個(gè) a.out 程序,都是在利用exec系統(tǒng)調(diào)用將新產(chǎn)生的子進(jìn)程完全替換成目標(biāo)進(jìn)程。
比如,這是一個(gè)死循環(huán)程序(目的是為了觀察,讓它活得久一點(diǎn)):
#include <stdio.h>
int main() {
int a = 0;
while (1) {
a++;
}
return 0;
}通過(guò)編譯,執(zhí)行:
gcc fork_example.c -o fork_example
./fork_example
查看進(jìn)程:top

可以發(fā)現(xiàn),fork_example的進(jìn)程的 PPID 為 54861,我們看看它是誰(shuí):ps 54861
PID TT STAT TIME COMMAND
54861 s018 Ss 0:00.23 /bin/zsh -il
很明顯,它是 zsh,現(xiàn)在可以終止fork_example: kill 57892
zsh: terminated ./fork_example
程序就會(huì)結(jié)束!以上例子,可以看到我們的子進(jìn)程,就是由一個(gè)父進(jìn)程 fork()之后替換的。
exec()
#include<unistd.h>
原型:
int execl(const char *path, const char *arg, ...) int execv(const char *path, char *const argv[]) int execle(const char *path, const char *arg, ..., char *const envp[]) int execve(const char *path, char *const argv[], char *const envp[]) int execlp(const char *file, const char *arg, ...) int execvp(const char *file, char *const argv[])
參數(shù):
path參數(shù)表示你要啟動(dòng)程序的名稱,包括路徑名;
arg參數(shù)表示啟動(dòng)程序所帶的參數(shù),一般第一個(gè)參數(shù)為要執(zhí)行命令名
返回值:成功返回0,失敗返回-1
上述exec系列函數(shù)底層都是通過(guò)execve系統(tǒng)調(diào)用實(shí)現(xiàn):
#include <unistd.h>int execve(const char *filename, char *const argv[],char *const envp[]);#include <unistd.h> int execve(const char *filename, char *const argv[],char *const envp[]);
① 查找方式:上表其中前4個(gè)函數(shù)的查找方式都是完整的文件目錄路徑,而最后2個(gè)函數(shù)(也就是以p結(jié)尾的兩個(gè)函數(shù))可以只給出文件名,系統(tǒng)就會(huì)自動(dòng)從環(huán)境變量“$PATH”所指出的路徑中進(jìn)行查找。
② 參數(shù)傳遞方式:exec函數(shù)族的參數(shù)傳遞有兩種方式,一種是逐個(gè)列舉的方式,而另一種則是將所有參數(shù)整體構(gòu)造成指針數(shù)組進(jìn)行傳遞。
在這里參數(shù)傳遞方式是以函數(shù)名的第5位字母來(lái)區(qū)分的,字母為“l”(list)的表示逐個(gè)列舉的方式,字母為“v”(vertor)的表示將所有參數(shù)整體構(gòu)造成指針數(shù)組傳遞,然后將該數(shù)組的首地址當(dāng)做參數(shù)傳給它,數(shù)組中的最后一個(gè)指針要求是NULL。讀者可以觀察execl、execle、execlp的語(yǔ)法與execv、execve、execvp的區(qū)別。
③ 環(huán)境變量:exec函數(shù)族使用了系統(tǒng)默認(rèn)的環(huán)境變量,也可以傳入指定的環(huán)境變量。這里以“e”(environment)結(jié)尾的兩個(gè)函數(shù)execle、execve就可以在envp[]中指定當(dāng)前進(jìn)程所使用的環(huán)境變量替換掉該進(jìn)程繼承的所以環(huán)境變量,這極大地提供了靈活度。
execl()
該函數(shù)的定義為:
int execl(const char *path, const char *arg, ...)
可以看到,它的參數(shù)為一個(gè) path,由于不帶 p,因此,最后一個(gè)參數(shù)為 NULL。
例如:
#include <stdio.h>
#include <unistd.h>
int main() {
printf("hello!\n");
// 替換 main 進(jìn)程
execl("/bin/ls", "ls", "-a", NULL);
// good bye! 并不會(huì)被打印出來(lái)
printf("good bye!\n");
return 0;
}執(zhí)行結(jié)果:
hello!
. a.out execlp.c fork_example myshell.c
.. execl.c fork.c fork_example.c
可以看到,它成功地執(zhí)行了"ls -a"命令。
execlp()
該函數(shù)的定義為:
int execlp(const char *file, const char *arg, ...)
該函數(shù)帶 p,第一個(gè)參數(shù)是一個(gè) *file,說(shuō)明不需要帶完整路徑,它會(huì)在默認(rèn)環(huán)境變量里面自動(dòng)查找:
#include <stdio.h>
#include <unistd.h>
int main() {
printf("hello!\n");
// 替換 main 進(jìn)程
execl("ls","ls", "-a", NULL);
// good bye! 并不會(huì)被打印出來(lái)
printf("good bye!\n");
return 0;
}運(yùn)行結(jié)果:
hello!
good bye!
說(shuō)明,并沒(méi)有成功替換,這是我們帶個(gè) p:
#include <stdio.h>
#include <unistd.h>
int main() {
printf("hello!\n");
// 替換 main 進(jìn)程
execlp("ls","ls", "-a", NULL);
// good bye! 并不會(huì)被打印出來(lái)
printf("good bye!\n");
return 0;
}運(yùn)行結(jié)果:
hello!
. a.out execlp.c fork_example myshell.c
.. execl.c fork.c fork_example.c
成功替換!其它的函數(shù)也是同理,就不再贅述了。
到此這篇關(guān)于exec()函數(shù)在C++中的應(yīng)用及其用法的文章就介紹到這了,更多相關(guān)C++ exec()函數(shù)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
FFRPC應(yīng)用 Client/Server使用及原理解析
這篇文章主要介紹了FFRPC應(yīng)用 Client/Server使用及原理解析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2019-08-08
c語(yǔ)言double類型默認(rèn)輸出小數(shù)幾位
在本篇文章里小編給大家分享的是關(guān)于c語(yǔ)言double類型默認(rèn)輸出小數(shù)幾位的相關(guān)知識(shí)點(diǎn),需要的朋友們可以學(xué)習(xí)下。2020-04-04
c++內(nèi)聯(lián)函數(shù)(inline)使用詳解
這篇文章主要介紹了c++內(nèi)聯(lián)函數(shù)(inline)使用詳解,需要的朋友可以參考下2014-04-04
通過(guò)GDB學(xué)習(xí)C語(yǔ)言的講解
今天小編就為大家分享一篇關(guān)于通過(guò)GDB學(xué)習(xí)C語(yǔ)言的講解,小編覺(jué)得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來(lái)看看吧2019-01-01
C語(yǔ)言如何在字符數(shù)組中插入一個(gè)字符
這篇文章主要介紹了C語(yǔ)言如何在字符數(shù)組中插入一個(gè)字符,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-06-06

