具有代表性的併發伺服器端實現模型:
多程序伺服器:通過建立多個程序提供服務;
多路復用伺服器:通過**並統一管理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發...