wordpress 添加友鏈什么是seo營銷
目錄
前言:
1 直接看代碼和現(xiàn)象
2 解釋原理
3 將代碼改成多進程版本
4 認識所有函數(shù)并使用
前言:
由前面的章節(jié)學習,我們已經(jīng)了解了進程狀態(tài),進程終止以及進程等待,今天,我們學習進程替換。進程替換我們從如下幾個點開始介紹,第一,直接看現(xiàn)象,第二,解釋原理,第三,將代碼改成多線程版本,第四,使用所有的替換函數(shù),認識參數(shù)的含義。
廢話不多說,直接進入主題。
1 直接看代碼和現(xiàn)象
我們使用一段代碼進入到進程替換:
int main()
{printf("test begin...\n"); execl("/usr/bin/ls","-l",NULL);printf("test end...\n"); return 0;
}
根據(jù)現(xiàn)象,我們可以看到,第二個printf是沒有被執(zhí)行的,但是第一個被執(zhí)行了,而我們使用到的函數(shù),叫做進程替換函數(shù),它一共有6種,本質上我們理解了其中的2 - 3個,我們就會使用全部的了。我們不妨使用man手冊查看一下:
輸入:
man exec
從文檔里面我們可以看到進程替換的函數(shù)版本有這么多個,每個函數(shù)都有返回值,但是呢我們不必在意返回值,因為通過現(xiàn)象,我們看到了執(zhí)行進程替換函數(shù)之后的代碼都失效了,所以返回值即使接受了,也沒有用處。?
關心的情況只有一種,就是進程替換失敗,但是這種情況十分的少見,我們就自然而然的給忽略了。
2 解釋原理
首先我們要清楚一個問題,進程替換的全名不是進程替換,替換的不是進程,是程序,所以在進程程序替換的這個過程,本質上是沒有創(chuàng)建新的進程的。
第一個點:進程程序替換中是沒有創(chuàng)建新進程的,無非是程序替換了PCB里面原來的數(shù)據(jù)。這里我們不妨設想一個點,如果PCB里面是自己替換自己的多沒意思,如果.cpp文件里的PCB可以被Java替換,shell腳本替換,豈不美哉?
第二個點,exec函數(shù)的作用是什么?
exec函數(shù)本質是一個加載函數(shù),因為有了exec函數(shù),在Linux中就可以將程序加載進去,因為進程程序替換的本質就是將不同的程序加載到內(nèi)存里面,加載靠的就是exec*函數(shù)。
3 將代碼改成多進程版本
將代碼改成多線程版本,我們要做的事就是,父進程創(chuàng)建子進程,創(chuàng)建了之后,子進程執(zhí)行被替換的程序,父進程只需要等待多個子進程就可以了。
此時,子進程的作用就有了兩個,一個是執(zhí)行父進程的代碼部分,一個是讓子進程執(zhí)行一個全新的程序。
int main()
{printf("testexec ... begin!\n");pid_t id = fork();if (id == 0){printf("child pid: %d\n", getpid());//childexecl("/usr/bin/ls", "ls", "-l", NULL);exit(1);}int status = 0;pid_t rid = waitpid(id, &status, 0);if (rid > 0){printf("father wait success, child exit code: %d\n", WEXITSTATUS(status));}printf("testexec ... end!\n");return 0;
}
該程序創(chuàng)建了一個子進程,子進程實現(xiàn)execl,如果執(zhí)行失敗,也就是替換失敗,就走exit,程序直接退出,退出碼為1,此時父進程只需要等待即可:
以上是現(xiàn)象,今天的重點都不是前三個,直接進入第四個。
4 認識所有函數(shù)并使用
所有的函數(shù)一共有execl execlp execle execv execvp execvpe,不難發(fā)現(xiàn),拿命令行參數(shù)進行舉例的話,選項一共有l(wèi) p e v。
由參數(shù),我們可以看到有pathname 和file,我們第一個使用的pathname即路徑名,我們要從哪里執(zhí)行程序,得通過該路徑告訴它,file同理,就是文件名,那么對于execl,代表的就是列表,也就是在命令行中我們?nèi)绾螆?zhí)行,在該函數(shù)里面就怎么書寫即可。
拿這個舉例:
execl("/usr/bin/ls","ls"."-l",NULL);
因為有l(wèi),所以我們要將平常執(zhí)行l(wèi)s命令的時候,如何執(zhí)行的給列出來,這個參數(shù)不是固定,所以我們可以執(zhí)行很多,ls -l -a -n都是可以的,但是注意點是最后的參數(shù)一定要是NULL,代表結束。
第二個函數(shù):
execv,這里面的v代表的是vector,C++中的順序表,所以我們看execv的參數(shù)是[],也就是我們應該這樣干:
int main()
{char* const argv[] ={(char*)"ls",(char*)"-l",(char*)"-a",(char*)"--color",NULL};execv("/usr/bin/ls", argv);return 0;
}
但是注意點是,最后結尾的仍然要是NULL,這里的強轉char*不是很必要,看自己的版本是否會進行報錯吧。
對于execvp:
p代表的是PATH,也就是環(huán)境變量,用戶可以不用傳對應的路徑,但是要傳對應的文件,就像:
int main()
{char* const argv[] ={(char*)"ls",(char*)"-l",(char*)"-a",(char*)"--color",NULL};//execv("/usr/bin/ls", argv);execvp("ls",argv);return 0;
}
那么現(xiàn)在關于execlp就應該不用介紹了吧?l,list出來命令行怎么寫的即可,p我們傳對應的文件名即可。
現(xiàn)在還沒介紹的就只有e了,e多好理解,environment,環(huán)境變量嘛不就是,當然了,因為父進程本身就有環(huán)境變量,子進程哪里用得著擔心我沒有環(huán)境變量啥的,根本不擔心:
使用這里就不介紹了,同理即可。
本文是非常粗略的介紹了一下進程程序替換,很多細節(jié)沒有介紹到,博主會在后面全部重新翻新的!!
感謝閱讀!