Linux信號概述
Linux系統(tǒng)中,信號是一種通信的方式,其通常用作用戶,系統(tǒng)或進程給目標進程發(fā)送的信息。
信號的作用:通知目標進程某個狀態(tài)的改變或系統(tǒng)異常。
產(chǎn)生的條件:
- 對于終端程序:可以是用戶輸入的特殊的終端字符,比如ctrl+c是中斷信號
- 系統(tǒng)異常,如浮點異?;蚍欠▋?nèi)存訪問
- 系統(tǒng)狀態(tài)變化
- 用戶運行kill命令或程序調(diào)用kill函數(shù)
程序必須處理(忽略可以算作處理的一種)一些常見信號
發(fā)送信號
進程給其他進程發(fā)送信號使用kill函數(shù)
#include<sys/types.h>
#include<signal.h>
int kill(pid_t pid,int sig);
- 作用:發(fā)送信號
- 參數(shù)
- pid:目標進程的id
- sig:發(fā)送的信號
- 返回值:
- 成功:0
- 失?。?1
信號處理方式
目標進程接收到信號后,需要一個接收函數(shù)來處理信號
#include<signal.h>
typedef void (*_sighandler_t)(int);
其中 sighandler_t為一個函數(shù)指針,可以用一個函數(shù)名給其賦值,int為這個函數(shù)的參數(shù),void表示這個函數(shù)返回值為NULL。
這是用戶自定義函數(shù),信號還有忽略和默認這兩種處理方式,其定義為
#include<bits/signum.h>
#define SIG_DFL((_sighandler_t)0)
#define SIG_ING((_sighandler_t)1)
SIG_DFL為默認處理方式,SIG_ING為忽略信號
中斷系統(tǒng)調(diào)用
程序在執(zhí)行處于阻塞狀態(tài)的系統(tǒng)調(diào)用時接收到信號,且該信號被我們設置了處理函數(shù),那么系統(tǒng)調(diào)用會被中斷。
如果接收到的信號的是暫停進程的信號(如SIGSTOP),即使我們沒為其設置處理函數(shù),它也可以中斷一些系統(tǒng)調(diào)用(如connect,epoll_wait)
信號函數(shù)
當我們接收到信號,就可以為信號設置一個處理函數(shù),Linux中有兩種信號處理函數(shù),分別是signal和sigaction
#include<signal.h>
typedef void (*sighandler_t)(int);
sighandler_t signal(int signum, sighandler_t handler);
- 作用:為信號設置處理函數(shù)
- 參數(shù)
- signum:信號的編號
- handler:函數(shù)指針,表示接收此信號要執(zhí)行的函數(shù)的地址
- SIG_IGN:忽略這個信號
- SIG_DFL:按照默認動作執(zhí)行這個信號
- 如果是一個函數(shù),則受到信號時去執(zhí)行這個函數(shù)
- 返回值
- 成功:函數(shù)指針,類型是sighandler_t
- 失?。篠IG_ERR
#include<signal.h>
int sigaction(int sig, const struct sigaction *act, struct sigaciton *oact);
- 作用:為信號設置處理函數(shù),或者獲取信號的處理函數(shù),或二者皆有可用來檢查和更改信號處理操作,可以支持可靠、實時信號的處理,并且支持信號傳遞信息
- 參數(shù):
-
- sig:信號的編號
- act:信號動作結(jié)構(gòu)體,見下
struct sigaction
{
void (*sa_handler)(int signum); /*簡單的信號處理函數(shù)指針*/
void (*sa_sigaction)(int signum, siginfo_t *info, void *context); /*復雜的信號處理函數(shù)指針*/
sigset_t sa_mask; /*信號阻塞集*/
int sa_flags; /*信號處理方式*/
};
網(wǎng)絡編程相關(guān)信號
SIGHUP:
當掛起進程的控制終端時,SIGHUP信號將被觸發(fā)。對于沒有控制終端的網(wǎng)絡后臺程序,SIGHUB信號可以用來強制服務器重讀配置程序。
SIGPIPE:
在默認情況下,往一個讀端關(guān)閉的管道(或socket連接)中寫數(shù)據(jù)將引發(fā)SIGPIPE信號。SIGPIPE信號的默認處理方式是結(jié)束進程。文章來源:http://www.zghlxwxcb.cn/news/detail-819127.html
所以為了避免因為往讀端關(guān)閉的管道寫數(shù)據(jù)導致進程結(jié)束,我們可以用send函數(shù)的MSG_NOSIGNAL標志來禁用寫操作觸發(fā)SIGPIPE信號文章來源地址http://www.zghlxwxcb.cn/news/detail-819127.html
到了這里,關(guān)于C++ Webserver從零開始:基礎(chǔ)知識(五)——信號的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!