您好,登錄后才能下訂單哦!
今天小編給大家分享一下怎么用Linux fork創建子進程的相關知識點,內容詳細,邏輯清晰,相信大部分人都還太了解這方面的知識,所以分享這篇文章給大家參考一下,希望大家閱讀完這篇文章后有所收獲,下面我們一起來了解一下吧。
1. pid_t fork(void);
功能:創建父子進程
參數:無
返回值:成功:在父進程中:返回值為子進程的PID
在子進程中:返回值為0 失敗:-1 注意:
1)fork函數是用來創建進程的,fork之后產生了兩個進程,每個進程都會有返回值, 所以父進程中返回的是子進程的進程號(>0);在子進程中返回0
2)子進程幾乎拷貝了父進程的全部內容。 包括代碼、數據、系統數據段中的pc值、棧中的數據、父進程中打開的文件等;但它們的PID、PPID是不同的。
3)父子進程有獨立的地址空間,互不影響;當在相應的進程中改變全局變量靜態變量,都互不影響。
4)若父進程先結束,子進程成為孤兒進程被init進程收養(此時子進程的父親就是init),子進程變成后臺進程。(init進程號為1)
5)若子進程先結束,父進程如果沒有及時回收,子進程變成僵尸進程(要避免僵尸進程產生)
2. pid_t getpid(void);
功能:得到正在調用此接口的進程的進程號
返回值:得到PID號
3. pid_t getppid(void);
功能:得到正在調用此接口的進程的父進程號
返回值:得到PID
4. pid_t wait(int *status) 頭文件
功能:阻塞等待任意子進程的結束,回收資源 status是一個整型指針,指向的對象用來保存子進程退出時的狀態。 status若為空,表示忽略子進程退出時的狀態 status若不為空,表示保存子進程退出時的狀態 另外,子進程的結束狀態可由Linux中一些特定的宏來測定。
5. pid_t waitpid(pid_t pid, int *status, int options)
功能:等待子進程的結束,回收資源
參數:
(1)pid: pid>0:只等待進程ID等于pid的子進程,不管已經有其他子進程運行結束退出了,只要指定的子進程還沒有結束,waitpid就會一直等下去。 pid=-1:等待任何一個子進程退出,此時和wait作用一樣。
(2)status:同wait
(3)options:WNOHANG:不阻塞,返回 0(沒有接受到),pid號(成功接收到) 0:同wait,阻塞父進程,等待子進程退出。失敗 -1 ,成功 pid號 返回值: 正常:結束的子進程的進程號,使用選項WNOHANG且沒有子進程結束時:0 出錯:-1 等價:wait(NULL) == waitpid(-1, NULL, 0) WEXITSTATUS(status)
6. void exit(int status); 功能:結束正在調用的進程,程序結束前,會清理緩存區
7. _exit:void _exit(int status); 功能:結束正在調用的進程,程序結束前不清理緩存區 注意: status是一個整型的參數,可以利用這個參數傳遞進程結束時的狀態。 通常0表示正常結束;其他的數值表示出現了錯誤,進程非正常結束。 在實際編程時,可以用wait系統調用接收子進程的返回值,進行相應的處理。 exit用于結束正在運行的整個程序,它將參數返回給OS,把控制權交給操作系統; 而return 是退出當前函數,返回函數值,把控制權交給調用函數。
fork創建子進程例子:
#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) //在子進程中:返回值為0 { printf("child\n"); printf("child getpid() %d \n",getpid()); printf("child getppid() %d \n",getppid()); exit(1); } else //在父進程中:返回值為子進程的PID { int s; wait(&s); printf("fork\n"); printf("father pid %d\n",pid);//子進程pid printf("father getpid() %d \n",getpid()); //父進程pid printf("father getppid() %d \n",getppid());//父進程的父進程的pid printf("father %d\n",WEXITSTATUS(s)); perror((char*)&s); } return 0; }
測試:
子進程會復制父進程的全部內容,出來pid號和ppid號,但是子進程程序執行從 fork 函數之后執行的
以上就是“怎么用Linux fork創建子進程”這篇文章的所有內容,感謝各位的閱讀!相信大家閱讀完這篇文章都有很大的收獲,小編每天都會為大家更新不同的知識,如果還想學習更多的知識,請關注億速云行業資訊頻道。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。