中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

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

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

怎么用Linux fork創建子進程

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

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

fork()函數通過系統調用創建一個與原來進程幾乎完全相同的進程,也就是兩個進程可以做完全相同的事,但如果初始參數或者傳入的變量不同,兩個進程也可以做不同的事。

怎么用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;
 }

測試:

怎么用Linux fork創建子進程

子進程會復制父進程的全部內容,出來pid號和ppid號,但是子進程程序執行從 fork 函數之后執行的

以上就是“怎么用Linux fork創建子進程”這篇文章的所有內容,感謝各位的閱讀!相信大家閱讀完這篇文章都有很大的收獲,小編每天都會為大家更新不同的知識,如果還想學習更多的知識,請關注億速云行業資訊頻道。

向AI問一下細節

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

AI

宁城县| 甘德县| 枝江市| 手游| 额尔古纳市| 灵川县| 襄城县| 鸡西市| 塔城市| 三门峡市| 漳州市| 宁城县| 吉首市| 武安市| 日土县| 芦溪县| 永福县| 安塞县| 辽阳县| 黄梅县| 简阳市| 榆中县| 翁牛特旗| 开平市| 龙山县| 五河县| 福州市| 抚远县| 西乌珠穆沁旗| 南康市| 海城市| 巴楚县| 临颍县| 建昌县| 上思县| 安远县| 墨江| 崇阳县| 大连市| 双峰县| 红桥区|