signal在伺服器開發中的簡單應用

2021-08-18 00:13:30 字數 2150 閱讀 6830

開發高效能的遊戲伺服器程式需要用到很多知識,也要注意很多細節,通過不斷地積累,將乙個乙個簡單的知識點組合,最終便形成乙個高效穩定的遊戲伺服器。

signal在伺服器開發中的簡單應用。

siganl函式用於設定某乙個訊號的對應動作,如果不設定,執行系統預設處理(通過 man 7 signal 查詢),有些結果可能不是我們想要的,有時候需要我們設定。如下是通過man查到的函式宣告:

#include

typedef void(*sighandler_t)(int);

sighandler_t signal(int signum, sighandler_t handler);

第乙個引數signum 顧名思義是要設定的訊號id,第二個引數是signum指定訊號的處理函式,當有該訊號觸發時,核心自動呼叫處理函式。引數有兩種,一種是指定的巨集, sig_ign忽略該訊號,或者是sig_dfl恢復系統對該訊號的預設處理,還有一種就是我們自定義函式處理。

我們也可以用更加健壯和安全的sigaction函式進行設定,宣告如下:

#include

int sigaction(int signum, const struct sigaction *act, struct sigaction *oldact);

第乙個引數signum 顧名思義是要設定的訊號id;

第二個引數act是指向sigaction結構體的指標,指定了對該訊號的處理,可以為null,程序會以預設方式對訊號處理;

第三個引數oldact用來獲取原來對該訊號的處理記憶體,可以為null。

在寫程式時有些訊號我們希望忽略處理:

sigpipe 13訊號在向沒有讀的管道寫入資料的時候觸發,系統的預設處理是終止程序。

當客戶端close了連線,伺服器端接著發包,會返回rst錯誤,如果再發核心會向程式傳送sigpipe訊號,預設處理是終止程序,結果不是我們想要的,通過以下**可以安全遮蔽sigpipe訊號。

struct sigaction sa;

memset(&sa, 0, sizeof(sa));

sa.sa_handler = sig_ign;

sigaction(sigpipe, &sa, null);

為了防止殭屍程序的發生,我們需要父程序忽略子程序的退出,交給系統

init

去**資源:

signal(sigchld, sig_ign);

在多執行緒程式中,我們可以通過pthread_sigmask的掩碼設定來遮蔽訊號,每個執行緒都有自己的掩碼,當我們需要子執行緒也遮蔽某些訊號時,在主線程中對sigmask進行設定後,生成的子執行緒將繼承主線程的掩碼,子執行緒也遮蔽了這些訊號。

多執行緒伺服器程式要遮蔽中斷訊號,通過以下**實現:

sigset_t sigmask;

sigemptyset(&sigmask);

sigaddset(&sigmask, sigint);//中斷訊號,ctrl +c觸發該訊號

pthread_sigmask(sig_block, & sigmask, null); /*子執行緒將繼承主線程的掩碼,子執行緒收不到sigint訊號*/

訊號可以用來生成崩潰日誌,在程式開始時,對

sigill (4 非法指令,如堆疊溢位,執行資料段等), sigabrt (6 程序停止執行呼叫abort函式), sigfpe  (8浮點異常 ,運算錯誤,如除0,溢位等), sigkill (9 停止程序(此訊號不能被忽略或捕獲)), sigsegv (11 無效地記憶體訪問), sigterm (15 終止程序訊號),sigxfsz(25,25,31超出檔案大小資源限制) 對這些訊號進行監聽,在這些訊號觸發時,系統自動呼叫我們自定義的sighandler函式,在這個函式中,我們可以將堆疊資訊寫入崩潰日誌檔案,查詢程式崩潰問題。獲取當前執行緒呼叫的堆疊可以用backtrace,backtrace_symbols,backtrace_symbols_fd 幾個函式 。標頭檔案execinfo.h

int backtrace (void **buffer, int size); 

char **backtrace_symbols (void *const *buffer, int size); 

void backtrace_symbols_fd (void *const *buffer, int size, int fd);  

將崩潰時的堆疊資訊寫入日誌檔案,通過gdb來定位導致崩潰的位置。

在伺服器中配置Jupyter

使用遠端伺服器進行實驗,而伺服器又沒有視覺化的介面,使用jupyter notebook可以很好地與遠端伺服器進行互動。英文教程.首先要確保安裝jupyter notebook pip install jupyter生成配置檔案 jupyter notebook generate config如圖 ...

在CMD中連線伺服器

在cmd命令視窗中,輸入ssh root 為伺服器ip位址。然後輸入之前設定的密碼即可成功連線。在操作伺服器的時候不推薦用root使用者直接操作,於是我們先建立乙個使用者 建立使用者的命令是 adduser 3.ubuntu下測試ssh時使用ssh localhost 命令,出現錯誤提示connec...

在伺服器中安裝MySQL

不過在伺服器上可沒有圖形介面可以操作。所以在伺服器上有兩種方法可以獲得這個軟體包 通過ftp從自己的電腦傳輸過去 我選擇第二種方法。首先,我到官網那找到鏈結 執行了命令之後會彈出乙個選單,直接選擇ok即可。之後更新軟體列表 sudo apt get update 這一階段完成!直接用apt安裝sud...