《網路程式設計》 第10章 多程序服務端

2021-10-10 19:09:57 字數 2316 閱讀 8697

具有代表性的併發伺服器端實現模型:

​ 多程序伺服器:通過建立多個程序提供服務;

​ 多路復用伺服器:通過**並統一管理i/o物件提供服務;

​ 多執行緒伺服器:通過生成與客戶端等量的執行緒提供服務。

#include

pid_t fork();

功能:​ 建立乙個程序。

返回值:

失敗,返回-1; 成功,返回程序id;

父程序: fork() 函式返回子程序id;

子程序: fork() 函式返回0。

​ 子程序執行完後,父程序並未對其**。

// 在 fork() 後程式會先執行子程序然後父程序。

// 在本程式中,父程序 sleep(30); 在這個過程中子程序未被**,而成為了殭屍程序。

// 在 這30s 過程中,開啟乙個新的終端 ps aux 在 sta欄內會看到乙個程序的狀態為 z+, 就是此殭屍程序。

30s後:

3、**子程序

​ 如果子程序未得到得到**,就會變成殭屍程序。

利用 wait() 函式

#include

pid_t wait( int *statloc );

功能:​ **終止的程序。

【注】若此時沒有程序終止,會阻塞等待,知道有程序終止。

引數:statloc: (被終止)程序的狀態,一般就定義 int 型變數,然後取其位址。

返回值:

​ 成功,返回終止的子程序 id; 失敗,返回 -1。

【補】wifexited() 函式

子程序正常終止返回「真」(true)。

​ eg. if( wifexited() )

wexitstatus() 函式

​ 返回子程序的返回值。指的是 return 或者 exit()返回值。

​ 【注】 exit() 別用0,1。

利用 waitpid() 函式

#include

pid_t waitpid( pid_t pid, int *statloc, int options );

功能:**終止的程序,且不會阻塞。

引數:​ pid:等待終止的目標子程序的id。

​ 若傳遞 -1, 則與 wait() 函式相同,可以等待任意子程序終止。

​ options:一般寫wnohang,效果:即使沒有終止的子程序也不會進入阻塞狀態,而是返回0並退出函式。

返回值:

​ 成功,返回終止的子程序id(或0); 失敗,返回 -1。

​ 訊號處理:在特定事件發生時由作業系統向程序傳送的訊息,然後今天處理。

struct sigaction

​ void (&sa_handler) (int); // 指向訊號觸發的時候呼叫的函式。eg.程序**函式

​ sigset_t mask; // 到時候用sigemptyset( &act.sa_mask )初始化

​ int sa_flags; // 直接寫0

#include

int sigaction( int signo, const struct sigaction act, struct sigaction oldact );

功能:利用 sigaction() 函式進行訊號處理操作。

引數:​ signo: 對應不同的訊號狀態:

​ act: 對應於引數 signo 的訊號處理資訊。(對應結構體如下)

​ oldact:直接寫0。

返回值成功,返回0; 失敗,返回 -1。

eg.例項

​ // 使用訊號**殭屍程序

​ struct sigaction act;

​ act.sa_handler = recycle; // **函式 recycle 自己寫

​ act.sa_flags = 0;

​ sigemptyset( &act.sa_mask );

​ sigaction( sigchld, &act, null );

詳情參考 unit_10_remove_zombie.c 利用訊號處理技術消滅殭屍程序。

​ 此節的案例相當重要。

**入口

(六)多程序實現TCP服務端

首先,為什麼要用多程序處理,多程序的好處是可靠性高,而且在處理大量資料的時候,多程序的速度會比多執行緒快,所有多程序還是要掌握的。在一些實際專案中,程序和執行緒要根據實際場景用。但是多程序是不能共享程序空間的,所以有很多變數都不能共享。除了fork 之前的變數是可以共享的。下面的 基本邏輯就是,用父...

C 網路程式設計(服務端程式)

include include 載入靜態lib檔案或者載入動態dll檔案 pragma comment lib,ws2 32.lib void main if lobyte wsadata.wversion 1 hibyte wsadata.wversion 1 建立用於監聽的套接字 socket ...

linux網路程式設計 廣播服務端

解釋都在 裡 廣播接收服務端 include include include include include include include include define dbgprint printf define print printf define ip found ip found ip發...