新聞中心
Linux Signal 信號(hào)機(jī)制是 Linux 操作系統(tǒng)的一項(xiàng)特性,用于進(jìn)程間通信和異常處理。信號(hào)是當(dāng)一個(gè)進(jìn)程發(fā)生異常行為時(shí)發(fā)送給另一個(gè)進(jìn)程的消息。在 Linux 中,信號(hào)被用于許多不同的目的,例如,當(dāng)一個(gè)進(jìn)程停止時(shí),當(dāng)一個(gè)進(jìn)程遇到了一個(gè)致命錯(cuò)誤時(shí),當(dāng)一個(gè)進(jìn)程收到一個(gè)用戶定義的中斷時(shí)等等。本文將,包括信號(hào)的基本定義、信號(hào)的種類(lèi)、信號(hào)的發(fā)送、處理和阻塞。

一、信號(hào)的基本定義
在 Linux 中,信號(hào)是由內(nèi)核或進(jìn)程發(fā)送給一個(gè)或多個(gè)進(jìn)程的異步通知。信號(hào)是一種軟件中斷,可以中斷進(jìn)程的執(zhí)行,讓進(jìn)程執(zhí)行一個(gè)指定的操作。信號(hào)通常用于進(jìn)程間通信和異常處理。Linux 定義了許多不同的信號(hào),每個(gè)信號(hào)都有一個(gè)唯一的編號(hào)和名稱。在應(yīng)用程序中,可以通過(guò)信號(hào)處理程序來(lái)捕獲和處理這些信號(hào)。
二、信號(hào)的種類(lèi)
Linux 定義了 64 種不同的信號(hào),每個(gè)信號(hào)都有一個(gè)唯一的編號(hào)和名稱。以下是最常見(jiàn)的信號(hào):
– SIGHUP:掛起進(jìn)程
– SIGINT:中斷進(jìn)程
– SIGQUIT:收到終止進(jìn)程信號(hào)
– SIGILL:指令不合法
– SIGTRAP:致命錯(cuò)誤
– SIGABRT:請(qǐng)求緊急終止
– SIGBUS:總線錯(cuò)誤
– SIGFPE:浮點(diǎn)異常
– SIGKILL:強(qiáng)制終止進(jìn)程
– SIGUSR1 和 SIGUSR2:用戶定義信號(hào)
– SIGSEGV:段錯(cuò)誤
– SIGPIPE:管道破裂,取消進(jìn)程之間的通信
– SIGALRM:實(shí)時(shí)時(shí)鐘的定時(shí)器到期,向進(jìn)程發(fā)送 SIGALRM
– SIGTERM:請(qǐng)求進(jìn)程自行終止
– SIGCHLD:子進(jìn)程狀態(tài)發(fā)生改變
除了上述信號(hào)外,還有一些其他的信號(hào)??梢酝ㄟ^(guò)命令 “kill -l” 查看所有信號(hào)的列表。
三、信號(hào)的發(fā)送
Linux 中,信號(hào)可以由內(nèi)核或進(jìn)程發(fā)送給另一個(gè)進(jìn)程。發(fā)送信號(hào)的方法有以下兩種:
1. kill 命令:可以用來(lái)向指定的進(jìn)程或進(jìn)程組發(fā)送信號(hào)。語(yǔ)法如下:
“`bash
kill [-s ] pid
“`
-s 表示要發(fā)送的信號(hào)編號(hào),pid 表示接收信號(hào)的進(jìn)程 ID。如果省略 -s 參數(shù),則默認(rèn)為發(fā)送 SIGTERM 信號(hào)??梢允褂妹?“kill -l” 查看所有信號(hào)編號(hào)。
2. 通過(guò)系統(tǒng)調(diào)用函數(shù)發(fā)送信號(hào):在應(yīng)用程序中,可以通過(guò)系統(tǒng)調(diào)用函數(shù)向另一個(gè)進(jìn)程發(fā)送信號(hào)。Linux 中,常用的發(fā)送信號(hào)的系統(tǒng)調(diào)用函數(shù)有以下三個(gè):
– kill(pid, sig):向進(jìn)程 ID 為 pid 的進(jìn)程發(fā)送信號(hào) sig。
– rse(sig):向當(dāng)前進(jìn)程發(fā)送信號(hào) sig。
– sigqueue(pid, sig, value):向進(jìn)程 ID 為 pid 的進(jìn)程發(fā)送一個(gè)帶有初始值 value 的 sig 信號(hào)。
四、信號(hào)的處理
當(dāng)進(jìn)程接收到一個(gè)信號(hào)時(shí),可以通過(guò)信號(hào)處理程序捕獲和處理這個(gè)信號(hào)。Linux 中,通過(guò) signal() 函數(shù)來(lái)綁定信號(hào)處理程序。該函數(shù)原型如下:
“`c
void (*signal(int signum, void (*handler)(int)))(int);
“`
其中,signum 表示要處理的信號(hào)編號(hào),handler 表示要執(zhí)行的信號(hào)處理程序。該函數(shù)返回一個(gè)函數(shù)指針,指向之前綁定的信號(hào)處理程序。信號(hào)處理程序一般有以下幾種類(lèi)型:
– 忽略信號(hào):該信號(hào)將被忽略,不做任何處理。
– 執(zhí)行默認(rèn)操作:對(duì)于大多數(shù)信號(hào),Linux 定義了默認(rèn)操作。例如,收到 SIGTERM 信號(hào)時(shí),進(jìn)程將被終止。
– 執(zhí)行用戶定義的操作:可以自行編寫(xiě)信號(hào)處理程序,執(zhí)行自定義操作。
在應(yīng)用程序中,可以使用 sigaction() 函數(shù)來(lái)綁定信號(hào)處理程序,該函數(shù)比 signal() 函數(shù)更加靈活和可靠。該函數(shù)原型如下:
“`c
int sigaction(int signum, const struct sigaction *act, struct sigaction *oldact);
“`
其中,signum 表示要處理的信號(hào)編號(hào),act 表示需要綁定的信號(hào)處理程序的地址,oldact 可選,表示之前的信號(hào)處理程序的地址。該函數(shù)返回 0 表示成功,-1 表示失敗。
五、信號(hào)的阻塞
在某些情況下,我們可能希望暫時(shí)忽略某些信號(hào),不讓其中斷當(dāng)前進(jìn)程的執(zhí)行。這時(shí),可以通過(guò)信號(hào)阻塞來(lái)達(dá)到這個(gè)目的。Linux 中,線程可以通過(guò) sigprocmask() 函數(shù)來(lái)設(shè)置信號(hào)的阻塞和解除阻塞。該函數(shù)原型如下:
“`c
int sigprocmask(int how, const sigset_t *set, sigset_t *oldset);
“`
其中,how 表示阻塞和解除阻塞的方式,set 表示需要阻塞的信號(hào),oldset 可選,表示之前被阻塞的信號(hào)。有以下幾種阻塞方式:
– SIG_BLOCK:將指定信號(hào)加入阻塞信號(hào)。
– SIG_UNBLOCK:將指定信號(hào)從阻塞信號(hào)中刪除。
– SIG_SETMASK:將當(dāng)前阻塞信號(hào)替換為指定信號(hào)。
可以使用 sigpending() 函數(shù)來(lái)獲取等待阻塞的信號(hào)。該函數(shù)原型如下:
“`c
int sigpending(sigset_t *set);
“`
其中,set 表示需要獲取的信號(hào)。該函數(shù)返回 0 表示成功,-1 表示失敗。
六、
相關(guān)問(wèn)題拓展閱讀:
- 怎么查看 linux signal
怎么查看 linux signal
有個(gè)current指針指向當(dāng)前正在運(yùn)行的進(jìn)程巖蠢,你一個(gè)ctrl+c后由產(chǎn)生一個(gè)信號(hào),缺游主要是current ,看看伏棗銷(xiāo)linux內(nèi)核中的進(jìn)程調(diào)度
linux signall的介紹就聊到這里吧,感謝你花時(shí)間閱讀本站內(nèi)容,更多關(guān)于linux signall,深入探討 Linux Signal 信號(hào)機(jī)制,怎么查看 linux signal的信息別忘了在本站進(jìn)行查找喔。
創(chuàng)新互聯(lián)服務(wù)器托管擁有成都T3+級(jí)標(biāo)準(zhǔn)機(jī)房資源,具備完善的安防設(shè)施、三線及BGP網(wǎng)絡(luò)接入帶寬達(dá)10T,機(jī)柜接入千兆交換機(jī),能夠有效保證服務(wù)器托管業(yè)務(wù)安全、可靠、穩(wěn)定、高效運(yùn)行;創(chuàng)新互聯(lián)專(zhuān)注于成都服務(wù)器托管租用十余年,得到成都等地區(qū)行業(yè)客戶的一致認(rèn)可。
當(dāng)前名稱:深入探討LinuxSignal信號(hào)機(jī)制(linuxsignall)
瀏覽路徑:http://www.fisionsoft.com.cn/article/cocjcgi.html


咨詢
建站咨詢
