最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Linux進程控制詳解及實例

 更新時間:2017年04月18日 11:39:28   作者:bamb00  
這篇文章主要介紹了Linux進程控制詳解及實例的相關資料,需要的朋友可以參考下

Linux進程控制詳解及實例

常用函數(shù):

  • fork() 通過復制調用進程來建立新的進程,是最基本的進程建立操作。
  • exec   包括一系列的系統(tǒng)調用,其中每個系統(tǒng)調用都完成相同的功能,即通過用一個新的程序覆蓋原內(nèi)存空間,來實現(xiàn)進程的轉變。各種exec系統(tǒng)調用之間的區(qū)別僅在于它們的參數(shù)構造不同。
  • wait() 它提供了初級的進程同步措施,能使一個進程等待,直到另一個進程結束為止。
  • exit()  常用來終止一個進程的運行。

進程的建立

  如果fork()調用成功,就會使內(nèi)核建立一個新的進程,所建的新進程是調用fork()進程的副本。也就是說,新的進程運行與其創(chuàng)建者一樣的程序,其中的變量具有與創(chuàng)建進程變量相同的值。

  系統(tǒng)調用fork()沒有參數(shù),它返回一個pid_t類型的值pid。pid被用來區(qū)分父進程和子進程。在父進程中pid被置為一個非0的正整數(shù);在子進程中,pid被置為0。

進程的運行

  exec系列調用:

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ù)的個數(shù)是任意的,所以必須用一個null指針來標記參數(shù)表的結尾。下面給出一個使用execl()和execv()調用來運行l(wèi)s的例子:   

/*execl的例子*/
#include <stdio.h>
#include <unistd.h>

main(){
  printf("Excuting ls\n");
  execl("/bin/ls", "ls", "-l", NULL);
  /*如果execl返回,說明調用失敗*/
  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)調用execlp()和execvp()分別類似于系統(tǒng)調用execl()和execv(),它們的主要區(qū)別是:execlp()和execvp()的第一個參數(shù)指向的是一個簡單的文件名,而不是一個路徑名。它們通過檢索shell環(huán)境變量PATH指出的目錄,來得到該文件名的路徑前綴部分。

exec和fork()的聯(lián)用

  通過聯(lián)用可以實現(xiàn)父進程運行一個與其不同的子進程,并且父進程不會被覆蓋。下面給出一個 exec和fork()聯(lián)用的例子:  

#include <stdio.h>
#include <unistd.h>

main(){
  int pid;
  /*fork子進程*/
  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()調用之前,只有一個進程A,fork()調用后就有了進程A和B。A是父進程,它正在執(zhí)行系統(tǒng)調用wait(),使進程A睡眠,直至進程B結束。同時進程B正在用execl裝入命令ls。exec調用后,進程B的程序被ls的代碼取代,執(zhí)行l(wèi)s命令的代碼。

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

相關文章

最新評論

六枝特区| 资阳市| 阿拉善左旗| 得荣县| 兴安盟| 马尔康县| 吴江市| 达州市| 繁昌县| 略阳县| 衡南县| 会理县| 巴彦淖尔市| 临西县| 四子王旗| 清河县| 大丰市| 义乌市| 临城县| 长宁县| 普宁市| 北流市| 湘乡市| 佳木斯市| 夏邑县| 景泰县| 泾川县| 聂荣县| 西乌珠穆沁旗| 郎溪县| 巩留县| 铅山县| 清镇市| 扬中市| 湾仔区| 茌平县| 神池县| 宣汉县| 定日县| 新疆| 凯里市|