濮阳杆衣贸易有限公司

主頁(yè) > 知識(shí)庫(kù) > Linux進(jìn)程控制詳解及實(shí)例

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

熱門(mén)標(biāo)簽:益陽(yáng)400電話申請(qǐng)辦理流程 怎么用百度地圖標(biāo)注坐標(biāo) 梧州防封電銷卡 400的電話一般從哪里辦理 上海機(jī)器人外呼系統(tǒng)哪家好 春運(yùn)地圖標(biāo)注app 地圖標(biāo)注人員分布 江西全自動(dòng)外呼系統(tǒng)報(bào)價(jià) 昆明電銷機(jī)器人價(jià)格

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命令的代碼。

 感謝閱讀,希望能幫助到大家,謝謝大家對(duì)本站的支持!

您可能感興趣的文章:
  • Linux中有效地管理進(jìn)程的8個(gè)命令
  • Linux中關(guān)于控制進(jìn)程的命令總結(jié)
  • 詳解Supervisor安裝與配置(Linux/Unix進(jìn)程管理工具)
  • Linux運(yùn)維基礎(chǔ)進(jìn)程管理及環(huán)境組成分析

標(biāo)簽:河南 九江 贛州 惠州 北京 亳州 懷化 新疆

巨人網(wǎng)絡(luò)通訊聲明:本文標(biāo)題《Linux進(jìn)程控制詳解及實(shí)例》,本文關(guān)鍵詞  Linux,進(jìn)程,控制,詳解,及,;如發(fā)現(xiàn)本文內(nèi)容存在版權(quán)問(wèn)題,煩請(qǐng)?zhí)峁┫嚓P(guān)信息告之我們,我們將及時(shí)溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡(luò),涉及言論、版權(quán)與本站無(wú)關(guān)。
  • 相關(guān)文章
  • 下面列出與本文章《Linux進(jìn)程控制詳解及實(shí)例》相關(guān)的同類信息!
  • 本頁(yè)收集關(guān)于Linux進(jìn)程控制詳解及實(shí)例的相關(guān)信息資訊供網(wǎng)民參考!
  • 推薦文章
    安徽省| 永寿县| 精河县| 巴里| 西乡县| 沽源县| 阳西县| 淮北市| 沙湾县| 大余县| 启东市| 临清市| 柏乡县| 茂名市| 福清市| 托里县| 项城市| 鹿泉市| 乌兰县| 上虞市| 桐城市| 息烽县| 台前县| 平邑县| 南岸区| 浦东新区| 聂拉木县| 津市市| 工布江达县| 奎屯市| 锡林郭勒盟| 大田县| 介休市| 泰州市| 武鸣县| 闽侯县| 伊川县| 山西省| 广德县| 新营市| 大石桥市|