C語(yǔ)言進(jìn)程程序替換的實(shí)現(xiàn)詳解
進(jìn)程程序替換
替換原理
使用fork創(chuàng)建子進(jìn)程后執(zhí)行的是和父進(jìn)程相同的程序,但是那樣并沒(méi)有多大的意義,子進(jìn)程往往會(huì)“程序替換” 去執(zhí)行另一個(gè)程序。程序替換的特點(diǎn)就是:不創(chuàng)建新的進(jìn)程,僅僅替換掉該進(jìn)程的代碼和數(shù)據(jù)。
替換函數(shù)
#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[]); //path表示全路徑,file表示文件名 //可變參數(shù)列表,在終端上怎么寫(xiě)的,就怎么傳參
注意:可變參數(shù)列表的參數(shù)個(gè)數(shù)是未確定的,如果你確定好自己的參數(shù)個(gè)數(shù)了,則以NULL結(jié)尾,表示就傳這么多個(gè)參數(shù)了
假設(shè)程序替換成ls
execl("/usr/bin/ls", "ls", "-l", "-a", NULL)
使用execl
據(jù)個(gè)例子
#include <stdio.h> #include <unistd.h> #include <sys/wait.h> #include <sys/types.h> #include <stdlib.h> int main(void) { if(fork() == 0) { //child printf("i am child process:%d\n",getpid()); execl("/usr/bin/ls", "ls", "-l", NULL); //可變參數(shù)列表以NULL結(jié)尾,表示參數(shù)就是這么多 } waitpid(-1, NULL, 0); //等待子進(jìn)程 printf("123\n"); printf("1234\n"); printf("12345\n"); printf("123456\n"); printf("1234567\n"); return 0; }
現(xiàn)象:
可以看到子進(jìn)程只執(zhí)行了ls -l
指令,而父進(jìn)程還是執(zhí)行自己的。
以上函數(shù):
- 如果調(diào)用成功,則加載新的程序集從啟動(dòng)代碼開(kāi)始執(zhí)行,不返回
- 如果調(diào)用失敗,則返回-1
- exec系列的函數(shù)只有調(diào)用失敗才會(huì)有返回值,沒(méi)有成功的返回值
替換函數(shù)名稱助記
以上的函數(shù)都是exec系列的函數(shù),并且都非常的相似,但是只要知道了其中的規(guī)律就能夠牢記
- 這些替換函數(shù)都是exec為基礎(chǔ),int類(lèi)型的返回值。
- 后綴有 l (list):表示后面的參數(shù)用列表
- 后綴有 p (path):表示前面的參數(shù)只需文件名,會(huì)自動(dòng)搜索環(huán)境變量PATH
- 后綴有 v (vector):表示后面的參數(shù)用數(shù)組
- 后綴有 e (env):表示自己維護(hù)環(huán)境變量
如果后面的參數(shù)使用數(shù)組,也就是后綴為v,也需要在最后加上NULL
。
實(shí)際上,前五個(gè)函數(shù)execl、execlp、execle、execv、execvp是庫(kù)函數(shù),而execve是系統(tǒng)調(diào)用。前五個(gè)函數(shù)都是都系統(tǒng)調(diào)用execve的封裝,只是封裝的形式不同,這樣可以應(yīng)對(duì)不同的情況。
到此這篇關(guān)于C語(yǔ)言進(jìn)程程序替換的實(shí)現(xiàn)詳解的文章就介紹到這了,更多相關(guān)C語(yǔ)言進(jìn)程內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- C語(yǔ)言中進(jìn)程間通訊的方式詳解
- C語(yǔ)言超詳細(xì)分析多進(jìn)程的概念與使用
- 詳解C語(yǔ)言進(jìn)程同步機(jī)制
- C語(yǔ)言實(shí)現(xiàn)進(jìn)程間通信原理解析
- C語(yǔ)言實(shí)現(xiàn)查看進(jìn)程是否存在的方法示例
- C語(yǔ)言中查詢進(jìn)程信號(hào)是否被遮罩或擱置的簡(jiǎn)單方法
- C語(yǔ)言中進(jìn)程信號(hào)集的相關(guān)操作函數(shù)詳解
- C語(yǔ)言中操作進(jìn)程信號(hào)的相關(guān)函數(shù)使用詳解
- C語(yǔ)言控制進(jìn)程之進(jìn)程等待詳解
相關(guān)文章
C++模板以及實(shí)現(xiàn)vector實(shí)例詳解
模板是為了實(shí)現(xiàn)泛型編程,所謂泛型編程,就是指編寫(xiě)與類(lèi)型無(wú)關(guān)的代碼,下面這篇文章主要給大家介紹了關(guān)于C++模板以及實(shí)現(xiàn)vector的相關(guān)資料,需要的朋友可以參考下2021-11-11Cocos2d-x保存用戶游戲數(shù)據(jù)CCUserDefault類(lèi)使用實(shí)例
這篇文章主要介紹了Cocos2d-x保存用戶游戲數(shù)據(jù)CCUserDefault類(lèi)使用實(shí)例,需要的朋友可以參考下2014-09-09Matlab繪制有趣的羅盤(pán)時(shí)鐘的示例代碼
這篇文章主要介紹了如何利用Matlab實(shí)現(xiàn)繪制有趣的羅盤(pán)時(shí)鐘,文中的示例代碼講解詳細(xì),對(duì)我們學(xué)習(xí)Matlab有一定的幫助,需要的可以參考一下2023-01-01C++讀取WAV音頻文件的頭部數(shù)據(jù)的實(shí)現(xiàn)方法
這篇文章主要介紹了C++讀取WAV音頻文件的頭部數(shù)據(jù)的實(shí)現(xiàn)方法的相關(guān)資料,希望通過(guò)本文能幫助到大家,讓大家實(shí)現(xiàn)這樣的方法,需要的朋友可以參考下2017-10-10詳解如何使用openssl創(chuàng)建自簽名證書(shū)
這篇文章主要為大家介紹了詳解如何使用openssl創(chuàng)建自簽名證書(shū)示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-04-04C++11 寫(xiě)一個(gè)只觸發(fā)一次槽函數(shù)的Qt connect函數(shù)
這篇文章主要為大家介紹了C++11 寫(xiě)一個(gè)只觸發(fā)一次槽函數(shù)的Qt connect函數(shù)實(shí)例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-09-09C語(yǔ)言中的abs()函數(shù)和exp()函數(shù)的用法
這篇文章主要介紹了C語(yǔ)言中的abs()函數(shù)和exp()函數(shù)的用法,是C語(yǔ)言入門(mén)學(xué)習(xí)中的基礎(chǔ)知識(shí),需要的朋友可以參考下2015-08-08零基礎(chǔ)學(xué)習(xí)C/C++需要注意的地方
這篇文章主要介紹了零基礎(chǔ)學(xué)習(xí)C/C++需要注意的地方,文中講解非常細(xì)致,供大家參考和學(xué)習(xí),想要學(xué)習(xí)C/C++的可以閱讀此文2020-06-06