做的圖怎么上傳到網(wǎng)站宣傳推廣方式有哪些
一、替換原理
????????用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*程序替換接口只有失敗返回值,沒(méi)有成功返回值。
二、子進(jìn)程進(jìn)行程序替換
????????通過(guò)子進(jìn)程進(jìn)行程序替換可以讓子進(jìn)程幫我們?nèi)プ鲆徊糠止ぷ?#xff0c;而且子進(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í)行我們的程序。 無(wú)論是什么語(yǔ)言,只要能在Linux系統(tǒng)下跑,都可以用exec系列的接口進(jìn)行程序替換,exec系列的接口只認(rèn)二進(jìn)制代碼和數(shù)據(jù)。
三、各種exec接口
?其它六個(gè)接口在底層都封裝了execve系統(tǒng)調(diào)用接口。
3.1、execlp?
????????exec接口中,l意為list,表示參數(shù)列表,v意為vector,就指的是數(shù)組。名字中帶p的這個(gè)p指的是PATH,也就是說(shuō)你不用告訴系統(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
????????execv的用法與execl的用法大致相同,只不過(guò)將execl后面的可變參數(shù)列表?yè)Q成一個(gè)指針數(shù)組。execvp也只是將execv前面的路徑換成程序名而已。不過(guò)這里要強(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ù)。可以通過(guò)地址空間繼承的方法,讓子進(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;
}