国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

【Linux】詳解進(jìn)程程序替換

這篇具有很好參考價(jià)值的文章主要介紹了【Linux】詳解進(jìn)程程序替換。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問。

一、替換原理

????????用fork創(chuàng)建子進(jìn)程后執(zhí)行的是和父進(jìn)程相同的程序(但有可能執(zhí)行不同的代碼分支),子進(jìn)程往往要調(diào)用一種exec函數(shù)以執(zhí)行另一個(gè)程序。當(dāng)進(jìn)程調(diào)用一種exec函數(shù)時(shí),該進(jìn)程的用戶空間代碼和數(shù)據(jù)完全被新程序替換,從新程序的啟動(dòng)例程開始執(zhí)行。調(diào)用exec并不創(chuàng)建新進(jìn)程,所以調(diào)用exec前后該進(jìn)程的id并未改變。程序替換所做的本質(zhì)工作就是將代碼和數(shù)據(jù)加載到內(nèi)存。

? ? ? ? 替換系統(tǒng)命令時(shí)命令行怎么寫,參數(shù)就怎么傳,參數(shù)以NULL結(jié)尾。程序替換一旦成功,exec*后序的代碼不再執(zhí)行。因?yàn)樵绦虻臄?shù)據(jù)和代碼被替換掉了。exec*程序替換接口只有失敗返回值,沒有成功返回值。

二、子進(jìn)程進(jìn)行程序替換

????????通過子進(jìn)程進(jìn)行程序替換可以讓子進(jìn)程幫我們?nèi)プ鲆徊糠止ぷ鳎易舆M(jìn)程發(fā)生程序替換不會(huì)影響父進(jìn)程執(zhí)行,因?yàn)樘鎿Q時(shí)代碼和數(shù)據(jù)會(huì)發(fā)生寫時(shí)拷貝。

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/wait.h>


int main()
{
    pid_t id = fork();
    if(id == 0)
    {
        execl("/usr/bin/ls", "ls", "-l", NULL);
        exit(0);
    }

    pid_t rid = waitpid(id, NULL, 0);
    printf("wait success!\n");
    return 0;
}

2.1、讓子進(jìn)程執(zhí)行我自己的程序

????????我自己寫了一個(gè)C++程序,向替換子進(jìn)程幫我跑一下:

//C++程序
#include <iostream>
using namespace std;

int main()
{

    cout << "Hello Linux!" << endl;
    cout << "Hello Linux!" << endl;
    cout << "Hello Linux!" << endl;
    cout << "Hello Linux!" << endl;

    return 0;
}

?C程序:

//讓子進(jìn)程執(zhí)行我自己寫的程序
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/wait.h>


int main()
{
    pid_t id = fork();
    if(id == 0)
    {
        execl("./mytest", "./mytest", NULL);
        exit(0);
    }

    pid_t rid= waitpid(id, NULL, 0);
    if(rid > 0)
    printf("wait success!\n");
    return 0;
}

????????執(zhí)行結(jié)果如下,證明了我們不僅僅可以替換子進(jìn)程執(zhí)行系統(tǒng)程序,還可以替換子進(jìn)程執(zhí)行我們的程序。 無論是什么語言,只要能在Linux系統(tǒng)下跑,都可以用exec系列的接口進(jìn)行程序替換,exec系列的接口只認(rèn)二進(jìn)制代碼和數(shù)據(jù)。

【Linux】詳解進(jìn)程程序替換,linux,運(yùn)維,服務(wù)器,c語言

三、各種exec接口

【Linux】詳解進(jìn)程程序替換,linux,運(yùn)維,服務(wù)器,c語言

【Linux】詳解進(jìn)程程序替換,linux,運(yùn)維,服務(wù)器,c語言?其它六個(gè)接口在底層都封裝了execve系統(tǒng)調(diào)用接口。

3.1、execlp?

【Linux】詳解進(jìn)程程序替換,linux,運(yùn)維,服務(wù)器,c語言

????????exec接口中,l意為list,表示參數(shù)列表,v意為vector,就指的是數(shù)組。名字中帶p的這個(gè)p指的是PATH,也就是說你不用告訴系統(tǒng),程序在哪里,只要告訴我名字就行,系統(tǒng)會(huì)自動(dòng)到你這個(gè)進(jìn)程的PATH環(huán)境變量中所保存的路徑中尋找。execlp只有第一個(gè)參數(shù)和execl不同,其余參數(shù)都相同。

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/wait.h>


int main()
{
    pid_t id = fork();
    if(id == 0)
    {
        execlp("ls", "ls", "-l", NULL);
        exit(0);
    }

    pid_t rid = waitpid(id, NULL, 0);
    printf("wait success!\n");
    return 0;
}

3.2、execv/execvp

【Linux】詳解進(jìn)程程序替換,linux,運(yùn)維,服務(wù)器,c語言

【Linux】詳解進(jìn)程程序替換,linux,運(yùn)維,服務(wù)器,c語言

????????execv的用法與execl的用法大致相同,只不過將execl后面的可變參數(shù)列表換成一個(gè)指針數(shù)組。execvp也只是將execv前面的路徑換成程序名而已。不過這里要強(qiáng)調(diào)的是:不要忘了路徑最前面的那一個(gè)斜杠,還有數(shù)組的結(jié)束標(biāo)志是NULL,一定要在數(shù)組的最后加上NULL。

#include <stdlib.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/wait.h>


int main()
{
    pid_t id = fork();
    if(id == 0)
    {
        char* argv[] = {"ls", "-l", "-a", NULL};
        //execvp("ls", argv);
        execv("/usr/bin/ls", argv);
        exit(0);
    }

    pid_t rid= waitpid(id, NULL, 0);
    if(rid > 0)
    printf("wait success!\n");
    return 0;
}

3.3、execle/execvpe/execve

????????程序替換不會(huì)替換環(huán)境變量數(shù)據(jù)。可以通過地址空間繼承的方法,讓子進(jìn)程拿到父進(jìn)程的所有環(huán)境變量。如果我們想傳遞全新的環(huán)境變量表給子進(jìn)程,就要使用帶e的程序替換接口。

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/wait.h>


int main()
{
    pid_t id = fork();
    if(id == 0)
    {
         char* env[] ={"aaa=bbbbbbbbbbbbbbbb", NULL};
         execle("./mytest", "./mytest",NULL,  env);
        exit(0);
    }

    pid_t rid= waitpid(id, NULL, 0);
    if(rid > 0)
    printf("wait success!\n");
    return 0;
}

【Linux】詳解進(jìn)程程序替換,linux,運(yùn)維,服務(wù)器,c語言文章來源地址http://www.zghlxwxcb.cn/news/detail-855007.html

到了這里,關(guān)于【Linux】詳解進(jìn)程程序替換的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場(chǎng)。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請(qǐng)注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請(qǐng)點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • 【Linux】Linux進(jìn)程控制及程序替換

    【Linux】Linux進(jìn)程控制及程序替換

    ?? 作者: 阿潤菜菜 ?? 專欄: Linux系統(tǒng)編程 在linux中fork是一個(gè)很重要的函數(shù),它可以已存在進(jìn)程中創(chuàng)建一個(gè)新進(jìn)程。新進(jìn)程為子進(jìn)程,而原進(jìn)程為父進(jìn)程。 fork函數(shù)返回兩個(gè)值,一個(gè)是子進(jìn)程的進(jìn)程號(hào)(pid),另一個(gè)是0。 父進(jìn)程可以通過pid來區(qū)分自己和子進(jìn)程,子進(jìn)程可

    2024年02月02日
    瀏覽(61)
  • [Linux]進(jìn)程控制詳解?。。▌?chuàng)建、終止、等待、替換)

    [Linux]進(jìn)程控制詳解?。。▌?chuàng)建、終止、等待、替換)

    ????????hello,大家好,這里是bang___bang_,在上兩篇中我們講解了進(jìn)程的概念、狀態(tài)和進(jìn)程地址空間,本篇講解進(jìn)程的控制!!包含內(nèi)容有進(jìn)程創(chuàng)建、進(jìn)程等待、進(jìn)程替換、進(jìn)程終止??! 附上前2篇文章鏈接: Linux——操作系統(tǒng)進(jìn)程詳解?。。ńㄗh收藏細(xì)品!?。bang___ba

    2024年02月15日
    瀏覽(24)
  • 【Linux】進(jìn)程程序替換

    【Linux】進(jìn)程程序替換

    ??作者主頁:@安 度 因 ??學(xué)習(xí)社區(qū):安度因 ??專欄鏈接:Linux 進(jìn)程創(chuàng)建時(shí)有兩個(gè)目標(biāo): 執(zhí)行父進(jìn)程的部分代碼,由自己編寫的,通過 if else 分流,讓子進(jìn)程執(zhí)行的對(duì)應(yīng)任務(wù)。 執(zhí)行和父進(jìn)程完全不同的程序 執(zhí)行和父進(jìn)程完全不同的代碼,

    2024年01月16日
    瀏覽(20)
  • 【Linux】進(jìn)程的程序替換

    【Linux】進(jìn)程的程序替換

    目標(biāo):為了讓子進(jìn)程幫父進(jìn)程執(zhí)行特定的任務(wù) 具體做法:1. 讓子進(jìn)程執(zhí)行父進(jìn)程的一部分代碼 紅框中的代碼實(shí)際上是父進(jìn)程的代碼,在沒有執(zhí)行fork之前代碼就有了,在沒有創(chuàng)建子進(jìn)程之前,父進(jìn)程的代碼加載到內(nèi)存了,子進(jìn)程被創(chuàng)建出來是沒有獨(dú)立的代碼,這個(gè)代碼是父進(jìn)

    2024年01月17日
    瀏覽(23)
  • 【Linux】—— 進(jìn)程程序替換

    【Linux】—— 進(jìn)程程序替換

    目錄 序言 (一)替換原理 1、進(jìn)程角度——見見豬跑 ?1?? 認(rèn)識(shí) execl 函數(shù) 2、程序角度——看圖理解 (二)替換函數(shù) 1、命名理解 ?2、函數(shù)理解 1??execlp 2??execv 3??execvp 4??execle 5??execve 6??execve (三)自制shell 總結(jié) 在前面的文章中,我已經(jīng)詳細(xì)的講解了進(jìn)程

    2024年02月12日
    瀏覽(19)
  • Linux :進(jìn)程的程序替換

    Linux :進(jìn)程的程序替換

    目錄 一、什么是程序替換 1.1程序替換的原理 1.2更改為多進(jìn)程版本 二、各種exe接口 2.2execlp ??編輯 2.2execv 2.3execle、execve、execvpe 用fork創(chuàng)建子進(jìn)程后執(zhí)行的是和父進(jìn)程相同的程序(但有可能執(zhí)行不同的代碼分支),子進(jìn)程往往要調(diào)用一種exec函數(shù)以執(zhí)行另一個(gè)程序。當(dāng)進(jìn)程調(diào)用一種

    2024年04月10日
    瀏覽(21)
  • Linux--進(jìn)程控制(2)--進(jìn)程的程序替換(奪舍)

    Linux--進(jìn)程控制(2)--進(jìn)程的程序替換(奪舍)

    目錄 進(jìn)程的程序替換 0.相關(guān)函數(shù) 1.先看現(xiàn)象 ?2.解釋原理 3.將代碼改成多進(jìn)程版 ?4.使用其它的替換函數(shù),并且認(rèn)識(shí)函數(shù)參數(shù)的含義 5.其它 ?關(guān)于進(jìn)程替換我們需要了解的6個(gè)函數(shù): 函數(shù)解釋: 這些函數(shù)如果調(diào)用成功則加載新的程序從啟動(dòng)代碼開始執(zhí)行,不再返回。 如果調(diào)用出

    2024年04月29日
    瀏覽(24)
  • 【Linux】進(jìn)程等待和替換——進(jìn)程等待的原理、wait/waitpid方法、進(jìn)程程序替換、進(jìn)程替換原理、替換函數(shù)

    【Linux】進(jìn)程等待和替換——進(jìn)程等待的原理、wait/waitpid方法、進(jìn)程程序替換、進(jìn)程替換原理、替換函數(shù)

    1.1進(jìn)程等待的概念 ?? 進(jìn)程等待指的是父進(jìn)程等待子進(jìn)程退出,以獲取子進(jìn)程的退出返回值,并釋放子進(jìn)程占用的資源。 ?? 當(dāng)子進(jìn)程先于父進(jìn)程退出,但父進(jìn)程沒有關(guān)注子進(jìn)程的退出狀態(tài)時(shí), 子進(jìn)程會(huì)為了保存自己的退出狀態(tài)而保持資源占用, 這種情況被稱為“僵尸進(jìn)

    2024年02月04日
    瀏覽(18)
  • Linux之進(jìn)程控制&&進(jìn)程終止&&進(jìn)程等待&&進(jìn)程的程序替換&&替換函數(shù)&&實(shí)現(xiàn)簡(jiǎn)易shell

    Linux之進(jìn)程控制&&進(jìn)程終止&&進(jìn)程等待&&進(jìn)程的程序替換&&替換函數(shù)&&實(shí)現(xiàn)簡(jiǎn)易shell

    1.1 fork的使用 我們可以使用man指令來查看一下 子進(jìn)程會(huì)復(fù)制父進(jìn)程的PCB,之間代碼共享,數(shù)據(jù)獨(dú)有,擁有各自的進(jìn)程虛擬地址空間。 這里就有一個(gè)代碼共享,并且子進(jìn)程是拷貝了父進(jìn)程的PCB,雖然他們各自擁有自己的進(jìn)程虛擬地址空間,數(shù)據(jù)是拷貝過來的,通過頁表映射到

    2024年04月17日
    瀏覽(26)
  • 【Linux】進(jìn)程控制 — 進(jìn)程程序替換 + 實(shí)現(xiàn)簡(jiǎn)易shell

    【Linux】進(jìn)程控制 — 進(jìn)程程序替換 + 實(shí)現(xiàn)簡(jiǎn)易shell

    上一節(jié)我們講了進(jìn)程終止和進(jìn)程等待等一系列問題,并做了相應(yīng)的驗(yàn)證,本章將繼續(xù)對(duì)進(jìn)程控制進(jìn)行學(xué)習(xí),我們將學(xué)習(xí)進(jìn)程程序替換,進(jìn)行相關(guān)驗(yàn)證,運(yùn)用系統(tǒng)進(jìn)程程序替換接口,自己模擬寫一個(gè)shell,該shell能夠?qū)崿F(xiàn)執(zhí)行指令,等一系列命令行操作…… 概念引入: 將可執(zhí)行

    2024年02月06日
    瀏覽(18)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包