国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁(yè) > 系統(tǒng) > Linux > 正文

Linux進(jìn)程控制詳解及實(shí)例

2019-10-26 18:52:08
字體:
來(lái)源:轉(zhuǎn)載
供稿:網(wǎng)友

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類型的值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()分別類似于系統(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命令的代碼。

發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 怀宁县| 合川市| 漠河县| 邹城市| 家居| 黑河市| 海宁市| 芦溪县| 饶阳县| 城固县| 临泉县| 贺州市| 阿瓦提县| 武定县| 吐鲁番市| 汉沽区| 潞城市| 资源县| 金川县| 浠水县| 嘉义县| 祁连县| 泗阳县| 凌海市| 霸州市| 环江| 蓬安县| 湘乡市| 多伦县| 海南省| 鄂托克旗| 和硕县| 巩义市| 贵南县| 怀柔区| 杨浦区| 石河子市| 阿尔山市| 兰溪市| 晋城| 长丰县|