最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

exec()函數(shù)在C++中的應(yīng)用及其用法

 更新時間:2023年05月09日 10:52:10   作者:Luyoungs  
exec()函數(shù)在C++中是一個進(jìn)程控制函數(shù),用于創(chuàng)建新進(jìn)程執(zhí)行其他程序或命令行指令。exec()函數(shù)可以替換當(dāng)前進(jìn)程的代碼和數(shù)據(jù),創(chuàng)建新的進(jìn)程運(yùn)行其他程序。exec()函數(shù)有多個版本,例如execl、execv、execle、execve等,根據(jù)不同的參數(shù)類型和個數(shù)來使用

前言

fork 函數(shù)之后,如果想要把子進(jìn)程換成一個我想要執(zhí)行的進(jìn)程,這時,就不得不使用 exec()函數(shù)了,這也是 fork()的意義所在。當(dāng)然,exec系列的函數(shù)也可以將當(dāng)前進(jìn)程替換掉,不一定非要 fork()一個子進(jìn)程。常見的 fork()調(diào)用例子有很多,比如從 wechat 發(fā)起一個語音電話、從 bash 或者zsh執(zhí)行一個 a.out 程序,都是在利用exec系統(tǒng)調(diào)用將新產(chǎn)生的子進(jìn)程完全替換成目標(biāo)進(jìn)程。

比如,這是一個死循環(huán)程序(目的是為了觀察,讓它活得久一點):

#include <stdio.h>
int main() {
    int a = 0;
    while (1) {
        a++;
    }
    return 0;
}

通過編譯,執(zhí)行:

gcc fork_example.c -o fork_example

./fork_example

查看進(jìn)程:top

可以發(fā)現(xiàn),fork_example的進(jìn)程的 PPID 為 54861,我們看看它是誰: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

程序就會結(jié)束!以上例子,可以看到我們的子進(jìn)程,就是由一個父進(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ù)表示你要啟動程序的名稱,包括路徑名;

arg參數(shù)表示啟動程序所帶的參數(shù),一般第一個參數(shù)為要執(zhí)行命令名

返回值:成功返回0,失敗返回-1

上述exec系列函數(shù)底層都是通過execve系統(tǒng)調(diào)用實現(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個函數(shù)的查找方式都是完整的文件目錄路徑,而最后2個函數(shù)(也就是以p結(jié)尾的兩個函數(shù))可以只給出文件名,系統(tǒng)就會自動從環(huán)境變量“$PATH”所指出的路徑中進(jìn)行查找。

② 參數(shù)傳遞方式:exec函數(shù)族的參數(shù)傳遞有兩種方式,一種是逐個列舉的方式,而另一種則是將所有參數(shù)整體構(gòu)造成指針數(shù)組進(jìn)行傳遞。

在這里參數(shù)傳遞方式是以函數(shù)名的第5位字母來區(qū)分的,字母為“l”(list)的表示逐個列舉的方式,字母為“v”(vertor)的表示將所有參數(shù)整體構(gòu)造成指針數(shù)組傳遞,然后將該數(shù)組的首地址當(dāng)做參數(shù)傳給它,數(shù)組中的最后一個指針要求是NULL。讀者可以觀察execl、execle、execlp的語法與execv、execve、execvp的區(qū)別。

③ 環(huán)境變量:exec函數(shù)族使用了系統(tǒng)默認(rèn)的環(huán)境變量,也可以傳入指定的環(huán)境變量。這里以“e”(environment)結(jié)尾的兩個函數(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ù)為一個 path,由于不帶 p,因此,最后一個參數(shù)為 NULL。

例如:

#include <stdio.h>
#include <unistd.h>
int main() {
    printf("hello!\n");
    // 替換 main 進(jìn)程
    execl("/bin/ls", "ls", "-a", NULL);
    // good bye! 并不會被打印出來
    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,第一個參數(shù)是一個 *file,說明不需要帶完整路徑,它會在默認(rèn)環(huán)境變量里面自動查找:

#include <stdio.h>
#include <unistd.h>
int main() {
    printf("hello!\n");
    // 替換 main 進(jìn)程
    execl("ls","ls", "-a", NULL);
    // good bye! 并不會被打印出來
    printf("good bye!\n");
    return 0;
}

運(yùn)行結(jié)果:

hello!
good bye!

說明,并沒有成功替換,這是我們帶個 p:

#include <stdio.h>
#include <unistd.h>
int main() {
    printf("hello!\n");
    // 替換 main 進(jìn)程
    execlp("ls","ls", "-a", NULL);
    // good bye! 并不會被打印出來
    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)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

您可能感興趣的文章:

相關(guān)文章

  • FFRPC應(yīng)用 Client/Server使用及原理解析

    FFRPC應(yīng)用 Client/Server使用及原理解析

    這篇文章主要介紹了FFRPC應(yīng)用 Client/Server使用及原理解析,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2019-08-08
  • C語言 詳解字符串基礎(chǔ)

    C語言 詳解字符串基礎(chǔ)

    在 C 語言中,字符串實際上是使用空字符 \0 結(jié)尾的一維字符數(shù)組。因此,\0 是用于標(biāo)記字符串的結(jié)束??兆址∟ull character)又稱結(jié)束符,縮寫 NUL,是一個數(shù)值為 0 的控制字符,\0 是轉(zhuǎn)義字符,意思是告訴編譯器,這不是字符 0,而是空字符
    2022-04-04
  • C++編程中指針的聲明與基本使用講解

    C++編程中指針的聲明與基本使用講解

    這篇文章主要介紹了詳解C++編程中C++編程中指針的聲明與基本使用講解,文中舉了簡單的例子來講如何在基本的數(shù)據(jù)結(jié)構(gòu)中使用指針,以及固定和可變指針的介紹,需要的朋友可以參考下
    2016-01-01
  • C++模板 index_sequence使用示例詳解

    C++模板 index_sequence使用示例詳解

    這篇文章主要為大家介紹了C++模板 index_sequence使用示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-12-12
  • c語言double類型默認(rèn)輸出小數(shù)幾位

    c語言double類型默認(rèn)輸出小數(shù)幾位

    在本篇文章里小編給大家分享的是關(guān)于c語言double類型默認(rèn)輸出小數(shù)幾位的相關(guān)知識點,需要的朋友們可以學(xué)習(xí)下。
    2020-04-04
  • c++內(nèi)聯(lián)函數(shù)(inline)使用詳解

    c++內(nèi)聯(lián)函數(shù)(inline)使用詳解

    這篇文章主要介紹了c++內(nèi)聯(lián)函數(shù)(inline)使用詳解,需要的朋友可以參考下
    2014-04-04
  • 通過GDB學(xué)習(xí)C語言的講解

    通過GDB學(xué)習(xí)C語言的講解

    今天小編就為大家分享一篇關(guān)于通過GDB學(xué)習(xí)C語言的講解,小編覺得內(nèi)容挺不錯的,現(xiàn)在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧
    2019-01-01
  • Qt控件點擊消息獲取的方法詳解

    Qt控件點擊消息獲取的方法詳解

    本文將利用Qt中的QLabel、QPushButton這兩個控件,為大家詳細(xì)介紹一下Qt控件點擊消息獲取的方法,文中的示例代碼講解詳細(xì),感興趣的可以了解一下
    2022-06-06
  • 《C++ primer plus》讀書筆記(三)

    《C++ primer plus》讀書筆記(三)

    本文是C++讀書筆記系列的第三篇,是讀完《C++ primer plus》一書第九、十兩章記錄下來的筆記,學(xué)習(xí)C++的同學(xué)可以看看參考下。
    2014-10-10
  • C語言如何在字符數(shù)組中插入一個字符

    C語言如何在字符數(shù)組中插入一個字符

    這篇文章主要介紹了C語言如何在字符數(shù)組中插入一個字符,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-06-06

最新評論

白河县| 共和县| 绍兴市| 大姚县| 长葛市| 米易县| 承德市| 旺苍县| 南木林县| 赣榆县| 巴马| 拉孜县| 澜沧| 阿拉善右旗| 蒲江县| 通山县| 张家港市| 高青县| 博客| 洛宁县| 延庆县| 九江市| 加查县| 郑州市| 兴仁县| 金塔县| 莫力| 宁化县| 延安市| 商洛市| 乌兰浩特市| 资溪县| 防城港市| 增城市| 天全县| 乌审旗| 会昌县| 佛学| 和林格尔县| 信宜市| 随州市|