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

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

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

前言

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

查看進程:top

可以發(fā)現(xiàn),fork_example的進程的 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é)束!以上例子,可以看到我們的子進程,就是由一個父進程 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”所指出的路徑中進行查找。

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

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

③ 環(huán)境變量:exec函數(shù)族使用了系統(tǒng)默認的環(huán)境變量,也可以傳入指定的環(huán)境變量。這里以“e”(environment)結(jié)尾的兩個函數(shù)execle、execve就可以在envp[]中指定當前進程所使用的環(huá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 進程
    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,說明不需要帶完整路徑,它會在默認環(huán)境變量里面自動查找:

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

運行結(jié)果:

hello!
good bye!

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

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

運行結(jié)果:

hello!
.               a.out           execlp.c        fork_example    myshell.c
..              execl.c         fork.c          fork_example.c

成功替換!其它的函數(shù)也是同理,就不再贅述了。

到此這篇關于exec()函數(shù)在C++中的應用及其用法的文章就介紹到這了,更多相關C++ exec()函數(shù)內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

您可能感興趣的文章:

相關文章

  • FFRPC應用 Client/Server使用及原理解析

    FFRPC應用 Client/Server使用及原理解析

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

    C語言 詳解字符串基礎

    在 C 語言中,字符串實際上是使用空字符 \0 結(jié)尾的一維字符數(shù)組。因此,\0 是用于標記字符串的結(jié)束。空字符(Null 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使用示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-12-12
  • c語言double類型默認輸出小數(shù)幾位

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

    在本篇文章里小編給大家分享的是關于c語言double類型默認輸出小數(shù)幾位的相關知識點,需要的朋友們可以學習下。
    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學習C語言的講解

    通過GDB學習C語言的講解

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

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

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

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

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

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

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

最新評論

兰坪| 泾阳县| 乌鲁木齐县| 彰化市| 桐柏县| 旅游| 鹰潭市| 德昌县| 左云县| 广水市| 东港市| 商河县| 临武县| 平安县| 买车| 民县| 凉山| 家居| 武邑县| 锡林浩特市| 湛江市| 衡东县| 双桥区| 陵川县| 内丘县| 昭苏县| 凤冈县| 涟源市| 武汉市| 修水县| 高淳县| 印江| 错那县| 莫力| 广元市| 漯河市| 苏尼特右旗| 本溪市| 丹巴县| 渑池县| 大名县|