Linux進(jìn)程控制詳解及實(shí)例
Linux進(jìn)程控制詳解及實(shí)例
常用函數(shù):
- fork() 通過(guò)復(fù)制調(diào)用進(jìn)程來(lái)建立新的進(jìn)程,是最基本的進(jìn)程建立操作。
- exec 包括一系列的系統(tǒng)調(diào)用,其中每個(gè)系統(tǒng)調(diào)用都完成相同的功能,即通過(guò)用一個(gè)新的程序覆蓋原內(nèi)存空間,來(lái)實(shí)現(xiàn)進(jìn)程的轉(zhuǎn)變。各種exec系統(tǒng)調(diào)用之間的區(qū)別僅在于它們的參數(shù)構(gòu)造不同。
- wait() 它提供了初級(jí)的進(jìn)程同步措施,能使一個(gè)進(jìn)程等待,直到另一個(gè)進(jìn)程結(jié)束為止。
- exit() 常用來(lái)終止一個(gè)進(jìn)程的運(yùn)行。
進(jìn)程的建立
如果fork()調(diào)用成功,就會(huì)使內(nèi)核建立一個(gè)新的進(jìn)程,所建的新進(jìn)程是調(diào)用fork()進(jìn)程的副本。也就是說(shuō),新的進(jìn)程運(yùn)行與其創(chuàng)建者一樣的程序,其中的變量具有與創(chuàng)建進(jìn)程變量相同的值。
系統(tǒng)調(diào)用fork()沒(méi)有參數(shù),它返回一個(gè)pid_t類(lèi)型的值pid。pid被用來(lái)區(qū)分父進(jìn)程和子進(jìn)程。在父進(jìn)程中pid被置為一個(gè)非0的正整數(shù);在子進(jìn)程中,pid被置為0。
進(jìn)程的運(yùn)行
exec系列調(diào)用:
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[]);
由于參數(shù)的個(gè)數(shù)是任意的,所以必須用一個(gè)null指針來(lái)標(biāo)記參數(shù)表的結(jié)尾。下面給出一個(gè)使用execl()和execv()調(diào)用來(lái)運(yùn)行l(wèi)s的例子:
/*execl的例子*/
#include <stdio.h>
#include <unistd.h>
main(){
printf("Excuting ls\n");
execl("/bin/ls", "ls", "-l", NULL);
/*如果execl返回,說(shuō)明調(diào)用失敗*/
perror("execl failed to run ls");
exit(1);
}
/*execv的例子*/
#include <stdio.h>
#include <unistd.h>
main(){
char *cmd[]={"ls", "-l", NULL};
execv("/bin/ls", cmd);
perror("execv failed");
exit(1);
}
系統(tǒng)調(diào)用execlp()和execvp()分別類(lèi)似于系統(tǒng)調(diào)用execl()和execv(),它們的主要區(qū)別是:execlp()和execvp()的第一個(gè)參數(shù)指向的是一個(gè)簡(jiǎn)單的文件名,而不是一個(gè)路徑名。它們通過(guò)檢索shell環(huán)境變量PATH指出的目錄,來(lái)得到該文件名的路徑前綴部分。
exec和fork()的聯(lián)用
通過(guò)聯(lián)用可以實(shí)現(xiàn)父進(jìn)程運(yùn)行一個(gè)與其不同的子進(jìn)程,并且父進(jìn)程不會(huì)被覆蓋。下面給出一個(gè) exec和fork()聯(lián)用的例子:
#include <stdio.h>
#include <unistd.h>
main(){
int pid;
/*fork子進(jìn)程*/
pid = fork();
switch(pid){
case -1:
perror("fork failed.");
exit(1);
case 0:
execl("/bin/ls", "ls", "-l", NULL);
perror("execl failed.");
exit(1);
default:
wait(NULL);
printf("ls completed.\n");
exit(0);
}
}
在fork()調(diào)用之前,只有一個(gè)進(jìn)程A,fork()調(diào)用后就有了進(jìn)程A和B。A是父進(jìn)程,它正在執(zhí)行系統(tǒng)調(diào)用wait(),使進(jìn)程A睡眠,直至進(jìn)程B結(jié)束。同時(shí)進(jìn)程B正在用execl裝入命令ls。exec調(diào)用后,進(jìn)程B的程序被ls的代碼取代,執(zhí)行l(wèi)s命令的代碼。
感謝閱讀,希望能幫助到大家,謝謝大家對(duì)本站的支持!
相關(guān)文章
一天一個(gè)shell命令 文本操作系列-comm命令用法
這篇文章主要介紹了linux系統(tǒng)下的comm命令是一個(gè)非常實(shí)用的文件對(duì)比命令,需要的朋友可以參考下2016-05-05
linux shell中curl 發(fā)送post請(qǐng)求json格式問(wèn)題的處理方法
這篇文章主要介紹了linux shell中curl 發(fā)送post請(qǐng)求json格式問(wèn)題的處理方法,文中給大家提到了linux中使用curl發(fā)送post請(qǐng)求問(wèn)題,需要的朋友可以參考下2018-07-07
Shell eval通過(guò)變量獲取環(huán)境變量的方法實(shí)現(xiàn)
這篇文章主要介紹了Shell eval通過(guò)變量獲取環(huán)境變量的方法實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-12-12
linux系統(tǒng)中的列出敏感用戶(hù)的腳本代碼
這里的敏感用戶(hù)是指這個(gè)用戶(hù)屬于多個(gè)組,或者這個(gè)用戶(hù)屬于的組名跟這個(gè)用戶(hù)名不一樣,需要的朋友可以參考下2014-09-09
Shell中關(guān)于時(shí)間和日期的函數(shù)總結(jié)
本文給大家詳細(xì)介紹了shell下關(guān)于時(shí)間和日期的函數(shù)總結(jié),本文給大家介紹的非常詳細(xì),具有參考借鑒價(jià)值,感興趣的朋友跟隨腳本之家小編一起看看吧2018-05-05
linux動(dòng)態(tài)鏈接庫(kù)使用方法分享
這篇文章主要介紹了linux動(dòng)態(tài)鏈接庫(kù)使用方法,大家參考使用吧2014-01-01
Shell腳本實(shí)現(xiàn)批量替換文件內(nèi)容
這篇文章主要介紹了Shell腳本實(shí)現(xiàn)批量替換文件內(nèi)容,本文主要實(shí)現(xiàn)批量修改一個(gè)備份腳本里的備份路徑,其它批量替換也可以修改使用,需要的朋友可以參考下2014-12-12

