亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 服務器 > Linux服務器 > 正文

Linux 創建子進程執行任務的實現方法

2024-09-05 23:04:32
字體:
來源:轉載
供稿:網友

Linux 操作系統緊緊依賴進程創建來滿足用戶的需求。例如,只要用戶輸入一條命令,shell 進程就創建一個新進程,新進程運行 shell 的另一個拷貝并執行用戶輸入的命令。Linux 系統中通過 fork/vfork 系統調用來創建新進程。本文將介紹如何使用 fork/vfork 系統調用來創建新進程并使用 exec 族函數在新進程中執行任務。

fork 系統調用

要創建一個進程,最基本的系統調用是 fork:

# include <unistd.h>pid_t fork(void);pid_t vfork(void);

調用 fork 時,系統將創建一個與當前進程相同的新進程。通常將原有的進程稱為父進程,把新創建的進程稱為子進程。子進程是父進程的一個拷貝,子進程獲得同父進程相同的數據,但是同父進程使用不同的數據段和堆棧段。子進程從父進程繼承大多數的屬性,但是也修改一些屬性,下表對比了父子進程間的屬性差異:

 

繼承屬性 差異
uid,gid,euid,egid 進程 ID
進程組 ID 父進程 ID
SESSION ID 子進程運行時間記錄
所打開文件及文件的偏移量 父進程對文件的鎖定
控制終端  
設置用戶 ID 和 設置組 ID 標記位  
根目錄與當前目錄  
文件默認創建的權限掩碼  
可訪問的內存區段  
環境變量及其它資源分配  

 

下面是一個常見的演示 fork 工作原理的 demo(筆者的環境為 Ubuntu 16.04 desktop):

#include <sys/types.h>#include <unistd.h>#include <stdio.h>#include <stdlib.h>int main(void){ pid_t pid; char *message; int n; pid = fork(); if(pid < 0) {  perror("fork failed");  exit(1); } if(pid == 0) {  printf("This is the child process. My PID is: %d. My PPID is: %d./n", getpid(), getppid()); } else {  printf("This is the parent process. My PID is %d./n", getpid()); } return 0;}

把上面的代碼保存到文件 forkdemo.c 文件中,并執行下面的命令編譯:

$ gcc forkdemo.c -o forkdemo

然后運行編譯出來的 forkdemo 程序:

$ ./forkdemo

Linux,創建,子進程,執行任務

fork 函數的特點是 "調用一次,返回兩次":在父進程中調用一次,在父進程和子進程中各返回一次。在父進程中返回時的返回值為子進程的 PID,而在子進程中返回時的返回值為 0,并且返回后都將執行 fork 函數調用之后的語句。如果 fork 函數調用失敗,則返回值為 -1。
我們細想會發現,fork 函數的返回值設計還是很高明的。在子進程中 fork 函數返回 0,那么子進程仍然可以調用 getpid 函數得到自己的 PID,也可以調用 getppid 函數得到父進程 PID。在父進程中用 getpid 函數可以得到自己的 PID,如果想得到子進程的PID,唯一的辦法就是把 fork 函數的返回值記錄下來。
注意:執行 forkdemo 程序時的輸出是會發生變化的,可能先打印父進程的信息,也可能先打印子進程的信息。

vfork 系統調用

vfork 系統調用和 fork 系統調用的功能基本相同。vfork 系統調用創建的進程共享其父進程的內存地址空間,但是并不完全復制父進程的數據段,而是和父進程共享其數據段。為了防止父進程重寫子進程需要的數據,父進程會被 vfork 調用阻塞,直到子進程退出或執行一個新的程序。由于調用 vfork 函數時父進程被掛起,所以如果我們使用 vfork 函數替換 forkdemo 中的 fork 函數,那么執行程序時輸出信息的順序就不會變化了。

使用 vfork 創建的子進程一般會通過 exec 族函數執行新的程序。接下來讓我們先了解下 exec 族函數。

exec 族函數

使用 fork/vfork 創建子進程后執行的是和父進程相同的程序(但有可能執行不同的代碼分支),子進程往往需要調用一個 exec 族函數以執行另外一個程序。當進程調用 exec 族函數時,該進程的用戶空間代碼和數據完全被新程序替換,從新程序的起始處開始執行。調用 exec 族函數并不創建新進程,所以調用 exec 族函數前后該進程的 PID 并不改變。

exec 族函數一共有六個:

#include <unistd.h>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[]);int execve(const char *path, char *const argv[], char *const envp[]);

函數名字中帶字母 "l" 的表示其參數個數不確定,帶字母 "v" 的表示使用字符串數組指針 argv 指向參數列表。
函數名字中含有字母 "p" 的表示可以自動在環境變量 PATH 指定的路徑中搜索要執行的程序。
函數名字中含有字母 "e" 的函數比其它函數多一個參數 envp。該參數是字符串數組指針,用于指定環境變量。調用這樣的函數時,可以由用戶自行設定子進程的環境變量,存放在參數 envp 所指向的字符串數組中。

事實上,只有 execve 是真正的系統調用,其它五個函數最終都調用 execve。這些函數之間的關系如下圖所示(此圖來自互聯網):

Linux,創建,子進程,執行任務

exec 族函數的特征:調用 exec 族函數會把新的程序裝載到當前進程中。在調用過 exec 族函數后,進程中執行的代碼就與之前完全不同了,所以 exec 函數調用之后的代碼是不會被執行的。

在子進程中執行任務

下面讓我們通過 vfork 和 execve 函數實現在子進程中執行 ls 命令:

#include <sys/types.h>#include <unistd.h>#include <stdio.h>#include <stdlib.h>int main(void){ pid_t pid; if((pid=vfork()) < 0) {  printf("vfork error!/n");  exit(1); } else if(pid==0) {  printf("Child process PID: %d./n", getpid());  char *argv[ ]={"ls", "-al", "/home", NULL};   char *envp[ ]={"PATH=/bin", NULL};  if(execve("/bin/ls", argv, envp) < 0)  {   printf("subprocess error");   exit(1);  }  // 子進程要么從 ls 命令中退出,要么從上面的 exit(1) 語句退出  // 所以代碼的執行路徑永遠也走不到這里,下面的 printf 語句不會被執行  printf("You should never see this message."); } else {  printf("Parent process PID: %d./n", getpid());  sleep(1); } return 0;}

把上面的代碼保存到文件 subprocessdemo.c 文件中,并執行下面的命令編譯:

$ gcc subprocessdemo.c -o subprocessdemo

然后運行編譯出來的 subprocessdemo程序:

$ ./subprocessdemo

Linux,創建,子進程,執行任務

總結

fork/vfork 函數和 exec 族函數都是 Linux 系統中非常重要的概念。本文試圖通過簡單的 demo 來演示這些函數的基本用法,為理解 Linux 系統中父進程與子進程的概念提供一些直觀的感受。


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
91在线观看免费高清完整版在线观看| 欧美在线视频网| 日韩av在线天堂网| 97视频免费看| 亚洲欧美日韩区| 欧美性少妇18aaaa视频| 亚洲乱码一区av黑人高潮| 国产一区二区三区三区在线观看| 91久久精品美女| 色综合久综合久久综合久鬼88| 成人性教育视频在线观看| 国产精品手机播放| 亚洲综合国产精品| 欧美在线观看网站| 中文字幕久热精品视频在线| 亚洲影院高清在线| 亚洲韩国欧洲国产日产av| 美日韩丰满少妇在线观看| 国产精品a久久久久久| 欧美日韩另类在线| 亚洲色图50p| 久久久成人的性感天堂| 国产精品久在线观看| 中文字幕亚洲欧美在线| 搡老女人一区二区三区视频tv| 久久亚洲精品国产亚洲老地址| 久久精品这里热有精品| 人人澡人人澡人人看欧美| 欧美日韩免费看| 尤物九九久久国产精品的特点| 久久久精品一区二区| 96sao精品视频在线观看| 久久久久久国产精品三级玉女聊斋| 国产香蕉一区二区三区在线视频| 亚洲国产精品久久久久秋霞不卡| 久久精品美女视频网站| 欧美另类69精品久久久久9999| 亚洲综合中文字幕在线观看| 欧美激情第三页| 国产精品91久久| 亚洲一区二区三区四区视频| 日韩美女免费线视频| 亚洲精品黄网在线观看| 欧美在线一级va免费观看| 久久国产精品久久久久久| 91极品女神在线| 欧美日韩免费看| 国产欧美中文字幕| 国产免费一区二区三区在线观看| 日韩成人在线电影网| 欧美美女操人视频| 欧美国产中文字幕| 欧美电影免费观看电视剧大全| 5252色成人免费视频| 国产啪精品视频| 久久精品国产99国产精品澳门| 69国产精品成人在线播放| 成人性生交大片免费看视频直播| 国产成人aa精品一区在线播放| 欧美高清性猛交| 26uuu另类亚洲欧美日本老年| 欧美性生交大片免网| 日韩美女视频免费看| 国产福利精品av综合导导航| 国产精品va在线播放| 成人国产精品日本在线| 亚洲少妇中文在线| 色综合伊人色综合网| 一本色道久久综合狠狠躁篇怎么玩| 久久中文字幕在线| 在线不卡国产精品| 久久99国产综合精品女同| 午夜精品一区二区三区在线视频| 欧美中文在线观看国产| 亚洲xxx视频| 中文字幕在线观看日韩| 一本色道久久综合狠狠躁篇怎么玩| 久久久女人电视剧免费播放下载| 欧美精品久久久久久久免费观看| 亚洲精品国产免费| 97在线观看免费高清| 亚洲影院色在线观看免费| 国产精品扒开腿做爽爽爽视频| 青草热久免费精品视频| 欧美国产日韩一区二区| 国产成+人+综合+亚洲欧美丁香花| 欧美在线视频观看| 91精品国产综合久久久久久久久| 国产精品国产三级国产aⅴ9色| 国产精品白丝jk喷水视频一区| 日本高清不卡在线| 国产日韩欧美在线| 久久97久久97精品免视看| 亚洲精品自产拍| 亚洲国产成人在线播放| 欧美高清电影在线看| 日韩精品福利网站| 欧美日韩在线免费| 久久视频这里只有精品| 国模精品系列视频| 热门国产精品亚洲第一区在线| 成人在线一区二区| 久久视频在线观看免费| 日韩在线免费视频观看| 岛国视频午夜一区免费在线观看| 国产精品美乳在线观看| 日韩一级裸体免费视频| 亚洲午夜精品久久久久久性色| 日本免费在线精品| 国产有码一区二区| 日韩av手机在线观看| 中文字幕精品av| 亚洲欧美综合区自拍另类| 97在线观看免费高清| 欧美精品在线看| 亚洲精品欧美日韩| 亚洲美女性生活视频| 国内精品久久影院| 亚洲成人av片在线观看| 国产精品久久久久久超碰| 精品福利一区二区| 95av在线视频| 91香蕉嫩草神马影院在线观看| 国产亚洲欧美另类中文| 久久精品中文字幕| 日韩成人中文字幕在线观看| 亚洲成成品网站| 精品国产91久久久久久| 日韩在线视频导航| 欧美日韩免费一区| 伊人久久久久久久久久久| 国产日韩欧美在线播放| 日韩激情av在线免费观看| 亚洲自拍高清视频网站| 成人乱人伦精品视频在线观看| 久久久久久久久久久网站| 欧美丝袜一区二区| www.日韩系列| 中文字幕国产精品久久| 国产精品久久久久久久av大片| 国产欧美精品日韩精品| 亚洲精品国产精品乱码不99按摩| 91夜夜揉人人捏人人添红杏| 久久视频精品在线| 欧美性受xxx| 欧美富婆性猛交| 亚洲影视中文字幕| 在线观看欧美www| 96国产粉嫩美女| 国外成人性视频| 久久免费视频在线观看| 高潮白浆女日韩av免费看| 国产一区二区三区中文| 国产精品成人aaaaa网站| 亚洲欧洲第一视频| 国产精品久久久久国产a级| 久久人91精品久久久久久不卡| 久久精品99国产精品酒店日本| 国产精品亚洲自拍| 久久人人97超碰精品888| 精品无人区乱码1区2区3区在线| 国产一区二区三区久久精品| 亚洲国产天堂久久综合网| 亚洲欧美在线第一页|