您好,登錄后才能下訂單哦!
今天小編給大家分享一下怎么用Linux fork創(chuàng)建子進(jìn)程的相關(guān)知識(shí)點(diǎn),內(nèi)容詳細(xì),邏輯清晰,相信大部分人都還太了解這方面的知識(shí),所以分享這篇文章給大家參考一下,希望大家閱讀完這篇文章后有所收獲,下面我們一起來了解一下吧。
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è)試:
子進(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è)資訊頻道。
免責(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)容。