亚洲激情专区-91九色丨porny丨老师-久久久久久久女国产乱让韩-国产精品午夜小视频观看

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Linux系統如何使用fork命令創建子進程執行任務

發布時間:2022-01-25 09:28:38 來源:億速云 閱讀:197 作者:小新 欄目:開發技術

小編給大家分享一下Linux系統如何使用fork命令創建子進程執行任務,希望大家閱讀完這篇文章之后都有所收獲,下面讓我們一起去探討吧!

fork 系統調用

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

 # include 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 #include #include #include int main(void)
 {
  pid_t pid;
  char *message;
  int n;
  pid = fork();
  if(pid把上面的代碼保存到文件 forkdemo.c 文件中,并執行下面的命令編譯: $ gcc forkdemo.c -o forkdemo然后運行編譯出來的 forkdemo 程序: $ ./forkdemofork 函數的特點是 “調用一次,返回兩次”:在父進程中調用一次,在父進程和子進程中各返回一次。在父進程中返回時的返回值為子進程的 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 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。這些函數之間的關系如下圖所示(此圖來自互聯網):exec 族函數的特征:調用 exec 族函數會把新的程序裝載到當前進程中。在調用過 exec 族函數后,進程中執行的代碼就與之前完全不同了,所以 exec 函數調用之后的代碼是不會被執行的。在子進程中執行任務下面讓我們通過 vfork 和 execve 函數實現在子進程中執行 ls 命令: #include #include #include #include int main(void)
 {
  pid_t pid;
  if((pid=vfork())把上面的代碼保存到文件 subprocessdemo.c 文件中,并執行下面的命令編譯: $ gcc subprocessdemo.c -o subprocessdemo然后運行編譯出來的 subprocessdemo程序: $ ./subprocessdemo

看完了這篇文章,相信你對“Linux系統如何使用fork命令創建子進程執行任務”有了一定的了解,如果想了解更多相關知識,歡迎關注億速云行業資訊頻道,感謝各位的閱讀!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

焦作市| 东乌珠穆沁旗| 屏边| 合肥市| 阿克| 南通市| 化德县| 镇巴县| 北海市| 昌图县| 麻江县| 孟州市| 香格里拉县| 双峰县| 临汾市| 汤阴县| 银川市| 铁力市| 治县。| 边坝县| 富蕴县| 洪泽县| 唐河县| 临高县| 托克逊县| 翼城县| 恭城| 阳高县| 莫力| 永平县| 广汉市| 昭觉县| 大关县| 虞城县| 新泰市| 武乡县| 大方县| 新密市| 清水县| 团风县| 宜兰市|