舉例講授C說話的fork()函數創立子過程的用法。本站提示廣大學習愛好者:(舉例講授C說話的fork()函數創立子過程的用法)文章只能為提供參考,不一定能成為您想要的結果。以下是舉例講授C說話的fork()函數創立子過程的用法正文
先來看如許一個例子,應用fork挪用execlp()函數來在Linux下完成ps或ls敕令:
#include "sys/types.h" #include "unistd.h" #include "stdio.h" #include "stdlib.h" int main() { pid_t result; result=fork(); //報錯處置 if(result==-1) { printf("Fork Error\n"); } //son else if(result==0) {//挪用execlp()函數,相當於"ps -ef" if((result=execlp("ps","ps",NULL))<0); printf("son\n"); } //father else { if((result=execlp("ls","ls",NULL))<0); printf("father\n"); } }
普通來說, 我們編寫1個通俗的c法式, 運轉這個法式直到法式停止, 體系只會分派1個pid給這個法式, 也就就說, 體系裡只會有一條關於這個法式的過程.
然則履行了fork() 這個函數就分歧了.
fork 這個英文單詞在英文裡是"分叉"意思, fork() 這個函數感化也很相符這個意思. 它的感化是復制以後過程(包含過程在內存裡的客棧數據)為1個新的鏡像. 然後這個新的鏡像和舊的過程同時履行下去. 相當於原來1個過程, 碰到fork() 函數後就分叉成兩個過程同時履行了. 並且這兩個過程是互不影響
參考上面這個小法式:
int fork_3(){ printf("it's the main process step 1!!\n\n"); fork(); printf("step2 after fork() !!\n\n"); int i; scanf("%d",&i); //prevent exiting return 0; }
在這個函數裡, 共有兩條printf語句, 然則履行履行時則打出了3行信息. 以下圖:
為何呢, 由於fork()函數將這個法式分叉了啊, 見上面的圖解:
可以見到法式在fork()函數履行時都只要1條主過程, 所以 step 1 會被打印輸入1次.
履行 fork()函數後, 法式分叉成了兩個過程, 1個是本來的主過程, 另1個是新的子過程, 它們都邑履行fork() 函數前面的代碼, 所以 step2 會被 兩條過程分離打印輸入各一次, 屏幕上就總共3條printf 語句了!
可以見到這個函數最初面我用了 scanf()函數來避免法式加入, 這時候檢查體系的過程, 就會發明兩個雷同名字的過程:
如上圖, pid 8808 誰人就是主過程了, 而 pid 8809誰人就是子過程啊, 由於它的parent pid是 8808啊!
須要留意的是, 假設沒有做特別處置, 子過程會一向存在, 即便fork_3()函數被挪用完成, 子過程會和主法式一樣,前往挪用fork_3() 函數的上一級函數持續履行, 直到全部法式加入.
可以看出, 假設fork_3() 被履行2次, 主法式就會分叉兩次, 終究釀成4個過程, 是否是有點風險. 所以下面所謂的特別處置很主要啊!
差別分主法式和子法式
現實運用中, 純真讓法式分叉意義不年夜, 我們新增一個子法式, 極可能是為了讓子過程零丁履行一段代碼. 完成與主過程分歧的功效.
要完成下面所說的功效, 現實上就是讓子過程和主過程履行分歧的代碼啊.
所以fork() 現實上有前往值, 並且在兩條過程中的前往值是分歧的, 在主過程裡 fork()函數會前往主過程的pid, 而在子過程裡會前往0! 所以我們可以依據fork() 的前往值來斷定過程究竟是哪一個過程, 便可以應用if 語句來履行分歧的代碼了!
以下面這個小法式fork_1():
int fork_1(){ int childpid; int i; if (fork() == 0){ //child process for (i=1; i<=8; i++){ printf("This is child process\n"); } }else{ //parent process for(i=1; i<=8; i++){ printf("This is parent process\n"); } } printf("step2 after fork() !!\n\n"); }
我對fork() 函數的前往值停止了斷定, 假如 前往值是0, 我就讓以為它是子過程, 不然是主法式. 那末我便可以讓這兩條過程輸入分歧的信息了.
輸入信息以下圖:
可以見到 子法式和主法式分離輸入了8條分歧的信息, 然則它們其實不是規矩瓜代輸入的, 由於它們兩條過程是相互平行影響的, 誰的手快就在屏幕上先輸入, 每次運轉的成果都有能夠分歧哦.
上面是圖解:
由圖解知兩條過程都對fork()前往值履行斷定, 在if 斷定語句平分別履行各自的代碼. 然則if斷定完成後, 照樣會回各自履行接上去的代碼. 所以 step2 照樣輸入了2次.