中文亚洲精品无码_熟女乱子伦免费_人人超碰人人爱国产_亚洲熟妇女综合网

當前位置: 首頁 > news >正文

城建設投資公司網站江蘇seo團隊

城建設投資公司網站,江蘇seo團隊,網站頁面優(yōu)化方案,金沙網站怎么做代理文章目錄進程程序替換替換原理替換函數函數返回值函數命名理解在makefile文件中一次生成兩個可執(zhí)行文件總結:程序替換時運行其它語言程序進程程序替換 程序要運行要先加載到內存當中 , 如何做到? 加載器加載進來,然后程序替換 為什么? ->馮諾依曼 因為CPU讀取數據的時候只…

文章目錄

      • 進程程序替換
      • 替換原理
      • 替換函數
      • 函數返回值
      • 函數命名理解
          • 在makefile文件中一次生成兩個可執(zhí)行文件
    • 總結:
      • 程序替換時運行其它語言程序

進程程序替換

程序要運行要先加載到內存當中 , 如何做到? 加載器加載進來,然后程序替換

為什么? ->馮諾依曼 因為CPU讀取數據的時候只能和內存打交道 CPU執(zhí)行程序的時候離內存最近.CPU要從內存拿數據和代碼,前提條件是外設當中的可執(zhí)行程序加載到內存中


替換原理

用fork創(chuàng)建子進程后執(zhí)行的是和父進程相同的程序(但有可能執(zhí)行不同的代碼分支), 那如果我們想讓子進程執(zhí)行一個“全新”的程序要怎么做呢? 我們就需要通過程序替換實現

子進程往往要調用一種exec*函數以執(zhí)行另一個程序

  • 當進程調用一種exec*函數時**,該進程的用戶空間代碼和數據完全被新程序替換,從新程序的啟動例程開始執(zhí)行**
  • 調用exec并不創(chuàng)建新進程,所以調用exec前后該進程的id并未改變

什么叫做進程程序替換?

進程不變,僅僅替換當前進程的代碼和數據的技術,并沒有創(chuàng)建新的進程(所以進程的id沒有改變) 叫做進程程序替換

image-20220528115434428

老程序的殼子不變,把新程序的代碼和數據替換進去, 進程替換是把磁盤上的程序加載到內存中


進程程序替換時有沒有創(chuàng)建新的進程?

進程程序替換之后,該進程對應的PCB.進程地址空間以及頁表等數據結構都沒有發(fā)生改變,只是進程在物理內存當中的數據和代碼發(fā)生了改變,所以并沒有創(chuàng)建新的進程,而且進程程序替換前后該進程的pid并沒有改變

程序替換的本質是什么?

本質是把程序的代碼+數據加載到特定進程的上下文中, C/C++程序要運行,必須要先加載到內存中

程序運行是如何加載到內存中的呢?

通過加載器,加載器的底層原理就是一系列的exec*程序替換函數

直接打開和程序替換打開有什么區(qū)別?

直接打開是要形成新的進程,而進程替換不形成新進程, ->沒有PCB的創(chuàng)建,先有的進程然后才能執(zhí)行程序替換


image-20220528114619079


我們fork子進程,然后讓子進程進行程序替換,會影響父進程嗎? 父子代碼是共享的嗎?

父進程不會受影響,因為進程是具有獨立性的!沒有修改數據的時候,父子共享代碼,修改就會發(fā)生寫時拷貝 進程替換會更改代碼區(qū)的代碼,要發(fā)生寫時拷貝,這樣就可以讓子進程執(zhí)行全新的程序

子進程剛被創(chuàng)建時,與父進程共享代碼和數據,但當子進程需要進行進程程序替換時,也就意味著子進程需要對其數據和代碼進行寫入操作,這時便需要將父子進程共享的代碼和數據進行寫時拷貝,此后父子進程的代碼和數據也就分離了,因此子進程進行程序替換后不會影響父進程的代碼和數據

image-20220528114955157

image-20220528115016987


替換函數

其實有六種以ex為ec開頭的函數,統(tǒng)稱exec函數

image-20220528115827690

#include <unistd.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[]);

函數返回值

  • 這些函數如果調用成功 則加載新的程序從啟動代碼開始執(zhí)行,不再返回.
  • 如果調用出錯則返回-1
  • 所以exec函數只有出錯的返回值而沒有成功的返回值, exec系列的函數,只要返回了,就一定是調用失敗

關于exec*系列函數的返回值:

只要進程的程序替換成功,就不會執(zhí)行后序的代碼, 所以,exec*函數成功是不需要進行返回值檢測,只要返回了,就一定是因為調用失敗了,直接退出程序就好

調用失敗的例子:

image-20220528120643822

如何證明它是調用失敗呢?

image-20220528121336747


函數命名理解

上述函數名看起來很容易混亂,我們理解他們的命名含義就好記了

替換函數接口后后綴含義
l(list)參數采用列表方式
v(vector)參數采用數組方式
p(path)自動搜索環(huán)境變量PATH,進行程序查找
e(env)自己維護環(huán)境變量,或者說自定義環(huán)境變量,可以傳入自己設置的環(huán)境變量

函數名參數格式是否帶路徑是否使用當前環(huán)境變量
execl列表
execlp列表
execle列表否,需自己組裝環(huán)境變量
execv數組
execvp數組
execve數組否,需自己組裝環(huán)境變量

事實上,只有execve才是真正的系統(tǒng)調用,其它五個函數最終都是調用的execve,所以execve在man手冊的第2節(jié),而其它五個函數在man手冊的第3節(jié),也就是說其他五個函數實際上是對系統(tǒng)調用execve進行了封裝,以滿足不同用戶的不同調用場景的

  • 手冊3:代表庫函數 手冊2:代表系統(tǒng)調用

用一張圖描述exec系列函數之間的關系:

image-20220528155208845


execl

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

第一個參數是要執(zhí)行程序的路徑,第二個后面的是可變參數列表,表示你要如何執(zhí)行這個程序, 注意以NULL為參數傳遞的結尾

后綴為l:即參數用列表傳遞

image-20220528121940711

例子:

execl("/usr/bin/ls","ls","-a","-l",NULL);//相當于執(zhí)行l(wèi)s -a -l

image-20220528151816035

執(zhí)行結果:

image-20220528151828206

execv

int execv(const char *path, char *const argv[])

第一個參數是要執(zhí)行程序的路徑,第二個參數是一個指針數組,數組當中的內容表示你要如何執(zhí)行這個程序,數組以NULL結尾

后綴為v:即參數用數組傳遞

//例子
char* argv[] = {"ls","-a","-l",NULL};
execv("/usr/bin/ls",argv);//相當于執(zhí)行l(wèi)s -a -l

使用例子:

main函數是可以攜帶參數的,argv是一個指針數組,指針指向命令行參數字符串,我們可以理解為:通過exec函數,把argv給了ls程序

image-20220528165703983


execlp && execvp

后綴為p:表示會自動在環(huán)境變量PATH中搜索,只需要直到程序名即可

**int execlp(const char file, const char arg, …)

第一個參數是要執(zhí)行程序的名字(只需要寫名稱,不需要帶路徑,會自動找),第二個參數是可變參數列表,表示你要如何執(zhí)行這個程序,并以NULL結尾

//例子:
execlp("ls","ls","-a","-l",NULL); //相當于執(zhí)行l(wèi)s -a -l
//第一個ls表示你要執(zhí)行誰,execlp會自動在環(huán)境變量PATH中根據這個程序名搜索這個程序在什么位置
//后面的ls表示我們要如何執(zhí)行它

例子:

image-20220528165807115

**int execvp(const char file, char const argv[])

第一個參數是要執(zhí)行程序的名字,第二個參數是一個指針數組,數組當中的內容表示你要如何執(zhí)行這個程序,數組以NULL結尾

//例子
char* argv[] = {"ls","-a","-l",NULL};
execvp("ls",argv);//相當于執(zhí)行l(wèi)s -a -l

例子:

image-20220528165828107


execle && execve

后綴為e:表示會自己維護環(huán)境變量,用自己設置的環(huán)境變量

**int execle(const char *path, const char arg, …,char const envp[])

第一個參數是要執(zhí)行程序的路徑,第二個參數是可變參數列表,表示你要如何執(zhí)行這個程序,并以NULL結尾,第三個參數是你自己設置的環(huán)境變量

//例如有兩個文件:myload 和myexe,如果我們在myload中設置了環(huán)境變量,在myexe文件就可以使用該環(huán)境變量//myload:
char* env[] = {"MYPATH:hello world",NULL};
execle("./myexe","myexe",NULL,env)  //注意這里先傳NULL結尾 再傳env
// 因為要執(zhí)行程序所在的位置已經找到了,所以第二個參數可以寫成:./myexe 也可以直接寫成myexe
//myexe
可以使用myload文件中的環(huán)境變量MYPATH

如果我們直接執(zhí)行myexe: 默認使用的是系統(tǒng)的環(huán)境變量

image-20220530204412080

我們運行myload去運行myexe,執(zhí)行的就是我們導入的環(huán)境變量

image-20220528165944420

**int execve(const char *path, char const argv[], char const envp[])

第一個參數是要執(zhí)行程序的路徑,第二個參數傳你要怎么執(zhí)行的,是一個指針數組,數組當中的內容表示你要如何執(zhí)行這個程序,數組以NULL結尾,第三個參數是你自己設置的環(huán)境變量

//例如有兩個文件:myload 和myexe,如果我們在myload中設置了環(huán)境變量,在myexe文件就可以使用該環(huán)境變量//myload:
char* env[] = {"MYPATH:hello world",NULL};
char* argv[]={"myexe",NULL};
execve("./myexe",argv,env);//myexe
可以使用myload文件中的環(huán)境變量MYPATH,MYVAL

image-20220530204319311exec*也可也調用我們自己的程序


在makefile文件中一次生成兩個可執(zhí)行文件

makefile默認會形成在依賴關系當中形成第一個它所碰到的依賴文件 (makefile默認會形成第一個碰到的目標文件)

那么如何在一個makefile文件中一次形成兩個可執(zhí)行文件呢?

.PHONY:all
all:myload myexemyload:myload.cgcc -0 $@ $^ -std=c99
myexe:myexe.cgcc -0 $@ $^ -std=c99.PHONY:clear
clear:	
rm -f myload myexe

image-20220528165459707

解析:利用偽目標總是被執(zhí)行的特點, all依賴的是myexe和myload, 因為all 沒有依賴方法,所以不會生成all. 但是因為有依賴文件,所以makefile在執(zhí)行的時候,一定想先形成的是all,形成all就得先形成myexe和myload. 所以會分別執(zhí)行myexe和myload的gcc代碼 而因為all沒有依賴方法,所以形成myexe和myload之后,并不會再形成all

如何我們想形成5個呢?

只需要把依賴文件往all后面不斷去添加, all : my1 my2 my3 然后后面再給依賴關系和依賴方法


總結:

所以的接口,看起來沒有太大的差別,只有一個就是參數的不同,為什么會有這么多接口?是為了滿足不同的應用場景


程序替換時運行其它語言程序

例子:

image-20220528152047190

想要執(zhí)行的是/usr/bin/python3路徑下的python程序, 如何執(zhí)行呢? python test.py

http://www.risenshineclean.com/news/31598.html

相關文章:

  • 昆明做網站競價東莞網站推廣宣傳
  • 做商城網站簡單嗎seo運營是做什么的
  • 確定B2B網站建設方案新聞聯播俄羅斯與烏克蘭
  • 營銷型網站的現狀近期國內新聞
  • b2b網站建設技術百度推廣創(chuàng)意范例
  • 光明新區(qū)建設網站網頁制作軟件
  • asp做的網站怎么發(fā)布如何創(chuàng)建自己的小程序
  • 月刊可以用什么網站做廣告投放平臺系統(tǒng)
  • 做阿里巴巴網站需要哪些資料網站建設流程圖
  • 網站解析后顯示建設中艾滋病阻斷藥有哪些
  • 網站開發(fā)工具鏈接服務器武漢搜索排名提升
  • 做快餐 承包食堂的公司網站百度識圖 上傳圖片
  • 人妖和美女做視頻網站廣告牌
  • 網站開發(fā)客戶的思路總結整站優(yōu)化提升排名
  • 微信端網站開發(fā)流程圖百度收錄入口提交
  • 燕郊網站建設天津seo推廣服務
  • 計算機網站建設的能力seo網站推廣簡歷
  • 輿情報告分析10000字seo整體優(yōu)化
  • wordpress的開發(fā)者搜索引擎排名優(yōu)化方法
  • 制作一個學校門戶網站中國培訓網
  • 餐飲網站開發(fā)性能需求分析免費收錄網站
  • 網站建設教程公司如何注冊網站平臺
  • 需要做網站建設的公司上海互聯網管理系統(tǒng)推廣公司
  • 做網站數據庫表設計seo整站優(yōu)化方案
  • 旅游網站模塊2022年seo最新優(yōu)化策略
  • 備案 添加網站網站可以自己建立嗎
  • 黃驊貼吧房屋租賃信息濰坊網站建設seo
  • 哪一些網站可以開戶做百度廣告長沙seo推廣公司
  • 創(chuàng)業(yè)做網站需要哪些seo在線教程
  • 寧波網站建設服務關鍵詞優(yōu)化精靈