溫馨提示×

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

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

怎么用Linux fork創(chuàng)建子進(jìn)程

發(fā)布時(shí)間:2022-01-26 16:28:03 來源:億速云 閱讀:160 作者:iii 欄目:開發(fā)技術(shù)

今天小編給大家分享一下怎么用Linux fork創(chuàng)建子進(jìn)程的相關(guān)知識(shí)點(diǎn),內(nèi)容詳細(xì),邏輯清晰,相信大部分人都還太了解這方面的知識(shí),所以分享這篇文章給大家參考一下,希望大家閱讀完這篇文章后有所收獲,下面我們一起來了解一下吧。

fork()函數(shù)通過系統(tǒng)調(diào)用創(chuàng)建一個(gè)與原來進(jìn)程幾乎完全相同的進(jìn)程,也就是兩個(gè)進(jìn)程可以做完全相同的事,但如果初始參數(shù)或者傳入的變量不同,兩個(gè)進(jìn)程也可以做不同的事。

怎么用Linux fork創(chuàng)建子進(jìn)程

1. pid_t fork(void);   

功能:創(chuàng)建父子進(jìn)程   

參數(shù):無   

返回值:成功:在父進(jìn)程中:返回值為子進(jìn)程的PID     

在子進(jìn)程中:返回值為0     失?。?1 注意:   

1)fork函數(shù)是用來創(chuàng)建進(jìn)程的,fork之后產(chǎn)生了兩個(gè)進(jìn)程,每個(gè)進(jìn)程都會(huì)有返回值,     所以父進(jìn)程中返回的是子進(jìn)程的進(jìn)程號(hào)(>0);在子進(jìn)程中返回0

2)子進(jìn)程幾乎拷貝了父進(jìn)程的全部內(nèi)容。      包括代碼、數(shù)據(jù)、系統(tǒng)數(shù)據(jù)段中的pc值、棧中的數(shù)據(jù)、父進(jìn)程中打開的文件等;但它們的PID、PPID是不同的。

3)父子進(jìn)程有獨(dú)立的地址空間,互不影響;當(dāng)在相應(yīng)的進(jìn)程中改變?nèi)肿兞快o態(tài)變量,都互不影響。

4)若父進(jìn)程先結(jié)束,子進(jìn)程成為孤兒進(jìn)程被init進(jìn)程收養(yǎng)(此時(shí)子進(jìn)程的父親就是init),子進(jìn)程變成后臺(tái)進(jìn)程。(init進(jìn)程號(hào)為1)

5)若子進(jìn)程先結(jié)束,父進(jìn)程如果沒有及時(shí)回收,子進(jìn)程變成僵尸進(jìn)程(要避免僵尸進(jìn)程產(chǎn)生)

2.  pid_t getpid(void); 

功能:得到正在調(diào)用此接口的進(jìn)程的進(jìn)程號(hào) 

返回值:得到PID號(hào)

3.  pid_t getppid(void); 

功能:得到正在調(diào)用此接口的進(jìn)程的父進(jìn)程號(hào) 

返回值:得到PID

4. pid_t wait(int *status) 頭文件

功能:阻塞等待任意子進(jìn)程的結(jié)束,回收資源 status是一個(gè)整型指針,指向的對(duì)象用來保存子進(jìn)程退出時(shí)的狀態(tài)。 status若為空,表示忽略子進(jìn)程退出時(shí)的狀態(tài) status若不為空,表示保存子進(jìn)程退出時(shí)的狀態(tài) 另外,子進(jìn)程的結(jié)束狀態(tài)可由Linux中一些特定的宏來測(cè)定。

5. pid_t waitpid(pid_t pid, int *status, int options) 

功能:等待子進(jìn)程的結(jié)束,回收資源 

參數(shù):   

(1)pid: pid>0:只等待進(jìn)程ID等于pid的子進(jìn)程,不管已經(jīng)有其他子進(jìn)程運(yùn)行結(jié)束退出了,只要指定的子進(jìn)程還沒有結(jié)束,waitpid就會(huì)一直等下去。 pid=-1:等待任何一個(gè)子進(jìn)程退出,此時(shí)和wait作用一樣。   

(2)status:同wait   

(3)options:WNOHANG:不阻塞,返回 0(沒有接受到),pid號(hào)(成功接收到) 0:同wait,阻塞父進(jìn)程,等待子進(jìn)程退出。失敗 -1 ,成功 pid號(hào) 返回值: 正常:結(jié)束的子進(jìn)程的進(jìn)程號(hào),使用選項(xiàng)WNOHANG且沒有子進(jìn)程結(jié)束時(shí):0 出錯(cuò):-1 等價(jià):wait(NULL) == waitpid(-1, NULL, 0)   WEXITSTATUS(status)

6. void exit(int status); 功能:結(jié)束正在調(diào)用的進(jìn)程,程序結(jié)束前,會(huì)清理緩存區(qū)

7. _exit:void _exit(int status); 功能:結(jié)束正在調(diào)用的進(jìn)程,程序結(jié)束前不清理緩存區(qū) 注意: status是一個(gè)整型的參數(shù),可以利用這個(gè)參數(shù)傳遞進(jìn)程結(jié)束時(shí)的狀態(tài)。 通常0表示正常結(jié)束;其他的數(shù)值表示出現(xiàn)了錯(cuò)誤,進(jìn)程非正常結(jié)束。 在實(shí)際編程時(shí),可以用wait系統(tǒng)調(diào)用接收子進(jìn)程的返回值,進(jìn)行相應(yīng)的處理。 exit用于結(jié)束正在運(yùn)行的整個(gè)程序,它將參數(shù)返回給OS,把控制權(quán)交給操作系統(tǒng); 而return 是退出當(dāng)前函數(shù),返回函數(shù)值,把控制權(quán)交給調(diào)用函數(shù)。

fork創(chuàng)建子進(jìn)程例子:

 #include #include #include #include #include 
 int main(int argc, const char *argv[])
 {
     pid_t pid;
     pid = fork();
     if(pid == -1)//失敗返回 -1
     {
         perror("fork fail : ");
         exit(1);
     }
     else if(pid == 0) //在子進(jìn)程中:返回值為0
     {
         printf("child\n");
         printf("child getpid() %d \n",getpid());
         printf("child getppid() %d \n",getppid());
         exit(1);
     }
     else //在父進(jìn)程中:返回值為子進(jìn)程的PID
     {
         int s;
         wait(&s);
         printf("fork\n");
         printf("father pid %d\n",pid);//子進(jìn)程pid
         printf("father getpid() %d \n",getpid()); //父進(jìn)程pid
         printf("father getppid() %d \n",getppid());//父進(jìn)程的父進(jìn)程的pid
         printf("father %d\n",WEXITSTATUS(s));
         perror((char*)&s);
     }
     return 0;
 }

測(cè)試:

怎么用Linux fork創(chuàng)建子進(jìn)程

子進(jìn)程會(huì)復(fù)制父進(jìn)程的全部內(nèi)容,出來pid號(hào)和ppid號(hào),但是子進(jìn)程程序執(zhí)行從 fork 函數(shù)之后執(zhí)行的

以上就是“怎么用Linux fork創(chuàng)建子進(jìn)程”這篇文章的所有內(nèi)容,感謝各位的閱讀!相信大家閱讀完這篇文章都有很大的收獲,小編每天都會(huì)為大家更新不同的知識(shí),如果還想學(xué)習(xí)更多的知識(shí),請(qǐng)關(guān)注億速云行業(yè)資訊頻道。

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI