Linux怎么确定信号来源,Linux信号来源和捕获处理以及signal函数简介
1、信號(hào)是什么?信號(hào)本質(zhì)是什么?
日常生活中,綠燈是一個(gè)信號(hào),停止標(biāo)牌是一個(gè)信號(hào),裁判手勢(shì)也是一個(gè)信號(hào)。
信號(hào)本質(zhì)(計(jì)算機(jī)):軟中斷信號(hào)(signal,又簡(jiǎn)稱為信號(hào))用來通知進(jìn)程發(fā)生了異步事件。在軟件層次上是對(duì)中斷機(jī)制的一種模擬,在原理上,一個(gè)進(jìn)程收到一個(gè)信號(hào)與處理器收到一個(gè)中斷請(qǐng)求可以說是一樣的。信號(hào)是進(jìn)程間通信機(jī)制中唯一的異步通信機(jī)制,一個(gè)進(jìn)程不必通過任何操作來等待信號(hào)的到達(dá),事實(shí)上,進(jìn)程也不知道信號(hào)到底什么時(shí)候到達(dá)。進(jìn)程之間可以互相通過系統(tǒng)調(diào)用kill發(fā)送軟中斷信號(hào)。內(nèi)核也可以因?yàn)閮?nèi)部事件而給進(jìn)程發(fā)送信號(hào),通知進(jìn)程發(fā)生了某個(gè)事件。信號(hào)機(jī)制除了基本通知功能外,還可以傳遞附加信息。
2、信號(hào)的來源
信號(hào)來自內(nèi)核, 生成信號(hào)的請(qǐng)求來自以下3個(gè)地方。
(1)用戶
用戶可以通過輸入Ctrl-C, Ctrl-\等命令,或是終端驅(qū)動(dòng)程序分配給信號(hào)控制字符的其他任何鍵來請(qǐng)求內(nèi)核產(chǎn)生信號(hào)。
(2)內(nèi)核
當(dāng)進(jìn)程執(zhí)行出錯(cuò)時(shí), 內(nèi)核給進(jìn)程發(fā)送一個(gè)信號(hào)。 例如,非法段存取,浮點(diǎn)數(shù)溢出,亦或是一個(gè)非法指令,內(nèi)核也利用信號(hào)通知進(jìn)程特定事件發(fā)生。
(3)進(jìn)程
一個(gè)進(jìn)程可以通過系統(tǒng)調(diào)用kill給另外一個(gè)進(jìn)程發(fā)送信號(hào), 一個(gè)進(jìn)程可以和另一個(gè)進(jìn)程通過信號(hào)通信。
3、信號(hào)類型
4、信號(hào)捕獲處理
進(jìn)程能夠通過系統(tǒng)調(diào)用signal告訴內(nèi)核, 它要如何處理信號(hào), 進(jìn)程有3個(gè)選擇。
(1)接收默認(rèn)處理(通常是消亡)
SIGINT的默認(rèn)處理是消亡, 進(jìn)程并不一定要使用signal接收默認(rèn)處理,但是進(jìn)程能夠通過以下調(diào)用來恢復(fù)默認(rèn)處理。
signal(SIGINT, SIG_DFL);
(2)忽略信號(hào)
程序可以通過以下調(diào)用來告訴內(nèi)核, 它需要忽略SIGINT。
signal(SIGINT, SIG_IGN);
(3)信號(hào)處理函數(shù)
程序能夠告訴內(nèi)核,當(dāng)程序到來時(shí)應(yīng)該調(diào)用哪個(gè)函數(shù)。
signal(signum, functionname);
5、信號(hào)處理例子
(1)默認(rèn)處理信號(hào)
#include#includeint main()
{
signal(SIGINT,SIG_DFL);
int i;
for( i = 0; i<10;++i)
{
printf("hello world\n");
sleep(1);
}
return 0;
}
?
(2)忽略信號(hào)
#include#includeint main()
{
signal(SIGINT,SIG_IGN);
int i;
for( i = 0; i<10;++i)
{
printf("hello world\n");
sleep(1);
}
return 0;
}
(3)使用信號(hào)處理處理函數(shù)
#include#includeint main()
{
void f(int);
signal(SIGINT,f);
int i;
for( i = 0; i<10;++i)
{
printf("hello world\n");
sleep(1);
}
return 0;
}
void f(int signum)
{
printf("SIGINT\n");
}
六、另外補(bǔ)充(sigaction函數(shù))
(1)?https://blog.csdn.net/u010889616/article/details/48159537(推薦)
(2)https://blog.csdn.net/wallaceli1981/article/details/4293324
總結(jié)
以上是生活随笔為你收集整理的Linux怎么确定信号来源,Linux信号来源和捕获处理以及signal函数简介的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: linux怎么知道ping命令,教程方法
- 下一篇: linux 验证邮箱账号,linux邮件