1. 程式人生 > >併發伺服器中的fork函式、 子程序與父程序的區別

併發伺服器中的fork函式、 子程序與父程序的區別

#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);
}