併發伺服器中的fork函式、 子程序與父程序的區別
阿新 • • 發佈:2019-02-10
#include <unistd.h>
int fork(void)
返回:在子程序當中為0,在父程序當中表示為子程序ID,若出錯則返回-1
fork函式的特性:
1.fork之前開啟的所有的描述符(檔案描述符、裝置描述符、sockfd、管道中的描述符等等)在fork之後由子程序共享的。
2.出了繼承開啟後的描述符之外,還有其他屬性,
例如:實際使用者ID、實際組ID、有效使用者ID、有效組ID
附屬組ID、程序組ID、會話ID
控制終端、當前工作目錄、根目錄、檔案模式建立遮蔽字、訊號遮蔽字和安排
環境、連線的共享儲存段、儲存映像、資源限制
fork之後父程序與子程序的區別
1.程序ID不同。
2.子程序中的tms_utime tms_stime tms_cutime 和 tms_ustime的值設為0
3.子程序不繼承父程序設定的檔案鎖,(子程序繼承了父程序中的所有互斥鎖、讀寫鎖和條件變數(包括它們的狀態),然而在多執行緒當中,另做處理)
4.子程序的未處理鬧鐘會被清除
5.子程序的未處理訊號集設定為空集
二、函式fork與exec族函式之間的關聯如下如所示
三、併發伺服器
pid_t pid; int listenfd,connfd; listenfd = Socket(...); Bind(listenfd,...); listen(listenfd,LISTENQ); for(;;) { connfd = Accept(listenfd,...); if(fork() == ) { close(listenfd); CS...; close(connfd); exit(0); } close(connfd); }