中文亚洲精品无码_熟女乱子伦免费_人人超碰人人爱国产_亚洲熟妇女综合网

當(dāng)前位置: 首頁 > news >正文

站長網(wǎng)seo綜合查詢工具百度托管公司

站長網(wǎng)seo綜合查詢工具,百度托管公司,做英文網(wǎng)站怎么賺錢,如何在國外做網(wǎng)站本篇文章會(huì)對(duì)Linux下的信號(hào)進(jìn)行詳細(xì)解釋。主要內(nèi)容是什么是信號(hào)、信號(hào)的產(chǎn)生、核心轉(zhuǎn)儲(chǔ)等問題。希望本篇文章會(huì)對(duì)你有所幫助。 文章目錄 引入 一、初識(shí)信號(hào) 1、1 生活中的信號(hào) 1、2 Linux 下的信號(hào) 1、3 信號(hào)進(jìn)程所得的初識(shí)結(jié)論 二、信號(hào)的產(chǎn)生 2、1 用戶通過終端輸入產(chǎn)生信號(hào) …

?

?? 本篇文章會(huì)對(duì)Linux下的信號(hào)進(jìn)行詳細(xì)解釋。主要內(nèi)容是什么是信號(hào)、信號(hào)的產(chǎn)生、核心轉(zhuǎn)儲(chǔ)等問題。希望本篇文章會(huì)對(duì)你有所幫助。

文章目錄

引入

一、初識(shí)信號(hào)

1、1 生活中的信號(hào)

1、2 Linux 下的信號(hào)

1、3 信號(hào)+進(jìn)程所得的初識(shí)結(jié)論

二、信號(hào)的產(chǎn)生

2、1?用戶通過終端輸入產(chǎn)生信號(hào)

2、1、1 理解組合鍵變成信號(hào)

2、1、2 驗(yàn)證ctrl + c 對(duì)應(yīng)?(2)SIGINT信號(hào) (signal()函數(shù))

2、2 核心轉(zhuǎn)儲(chǔ)(拓展)

2、3 系統(tǒng)調(diào)用接口產(chǎn)生信號(hào)

2、4 軟件條件產(chǎn)生信號(hào)

2、5 由硬件異常產(chǎn)生信號(hào)

三、總結(jié)


🙋?♂??作者:@Ggggggtm?🙋?♂?

👀?專欄:Linux從入門到精通? 👀

💥?標(biāo)題:信號(hào)產(chǎn)生💥

????寄語:與其忙著訴苦,不如低頭趕路,奮路前行,終將遇到一番好風(fēng)景?????

引入

? 在Linux系統(tǒng)中,信號(hào)是一種輕量級(jí)的通信機(jī)制,可以用于實(shí)現(xiàn)進(jìn)程之間的協(xié)作和通信。每個(gè)信號(hào)都有一個(gè)唯一的編號(hào),通常以SIG開頭,例如SIGINT、SIGTERM等。這些信號(hào)的含義和行為在Linux系統(tǒng)中是標(biāo)準(zhǔn)化的,但也可以通過自定義信號(hào)處理程序來改變它們的行為。

? Linux信號(hào)在各種情況下都有廣泛的應(yīng)用,從終端用戶通過Ctrl+C發(fā)送中斷信號(hào),到系統(tǒng)管理員使用信號(hào)來管理和監(jiān)控進(jìn)程,以及進(jìn)程之間通過信號(hào)進(jìn)行通信和協(xié)作。因此,理解Linux信號(hào)是系統(tǒng)管理員和開發(fā)人員的重要技能,有助于更好地控制和管理Linux系統(tǒng)中的進(jìn)程。

一、初識(shí)信號(hào)

1、1 生活中的信號(hào)

? 其實(shí)在生活中,我們也經(jīng)常有意無意的接受信號(hào)。比如,玩游戲時(shí)隊(duì)友發(fā)送的請(qǐng)求集合、訂購?fù)赓u時(shí)快遞員到了你樓下給你打電話,你也收到快遞到來的通知等等。古代戰(zhàn)爭傳遞信號(hào)的方式是烽煙(烽火)。

? 但是當(dāng)你收到信號(hào)時(shí),你就會(huì)立即處理嗎?實(shí)際上可能并不會(huì)。例如,外賣到了但是你正在打游戲,需5min之后才能去取快遞。那么在在這5min之內(nèi),你并沒有下去去取快遞,但是你是知道有快遞到來了。也就是取快遞的行為并不是一定要立即執(zhí)行,可以理解成“在合適的時(shí)候去取”。

? 我們接收到信號(hào),并且處理時(shí)會(huì)有很多處理方法。例如我們?nèi)』貋砜爝f,就要開始處理快遞了。而處理快遞一般方式有三種:

  1. 執(zhí)行默認(rèn)動(dòng)作(幸福的打開快遞,使用商品);
  2. 執(zhí)行自定義動(dòng)作(快遞是零食,你要送給你你的女朋友);
  3. 忽略快遞(快遞拿上來之后,扔掉床頭,繼續(xù)開一把游戲。

1、2 Linux 下的信號(hào)

? Linux信號(hào)通常由操作系統(tǒng)或其他進(jìn)程發(fā)送給目標(biāo)進(jìn)程,可以用于多種目的,例如中斷進(jìn)程、終止進(jìn)程或請(qǐng)求進(jìn)程執(zhí)行某個(gè)特定操作。本質(zhì)是一種通信機(jī)制。

? 標(biāo)準(zhǔn)信號(hào)是一組在Linux系統(tǒng)中具有固定編號(hào)和含義的信號(hào)。舉個(gè)例子:我們平常在Linux下進(jìn)程會(huì)使用Ctrl+C來終止當(dāng)前的進(jìn)程。這個(gè)本質(zhì)就是向進(jìn)程發(fā)送了一個(gè)2號(hào)信號(hào)。Linux下有很多信號(hào),具體如下圖:

? 實(shí)際上一共是有62個(gè)信號(hào),因?yàn)椴]有32號(hào)和33號(hào)信號(hào)。本篇文章重點(diǎn)講解普通信號(hào),也就是1~31號(hào)信號(hào)。還有一種信號(hào)是實(shí)時(shí)信號(hào)。實(shí)時(shí)信號(hào)是一組具有不同編號(hào)和含義的信號(hào),通常用于高優(yōu)先級(jí)任務(wù)和實(shí)時(shí)系統(tǒng)。實(shí)時(shí)信號(hào)的編號(hào)范圍從34到64。

? 我們這里先給出普通信號(hào)的編號(hào)、名稱和含義,下文也會(huì)對(duì)一些重點(diǎn)信號(hào)進(jìn)行講解:

  • SIGHUP(1):?掛起信號(hào)。
  • SIGINT(2):?中斷信號(hào)。
  • SIGQUIT(3):?退出信號(hào)。
  • SIGILL(4):?非法指令信號(hào)。
  • SIGTRAP(5):?跟蹤/陷阱信號(hào)。
  • SIGABRT(6):?中止信號(hào)。
  • SIGBUS(7):?總線錯(cuò)誤信號(hào)。
  • SIGFPE(8):?浮點(diǎn)異常信號(hào)。
  • SIGKILL(9):?強(qiáng)制終止信號(hào)。
  • SIGUSR1(10):?用戶自定義信號(hào)1。
  • SIGSEGV(11):?段錯(cuò)誤信號(hào)。
  • SIGUSR2(12):?用戶自定義信號(hào)2。
  • SIGPIPE(13):?管道破裂信號(hào)。
  • SIGALRM(14):?超時(shí)信號(hào)。
  • SIGTERM(15):?終止信號(hào)。
  • SIGSTKFLT(16):?協(xié)處理器棧錯(cuò)誤信號(hào)。
  • SIGCHLD(17):?子進(jìn)程狀態(tài)改變信號(hào)。
  • SIGCONT(18):?繼續(xù)執(zhí)行信號(hào)。
  • SIGSTOP(19):?停止信號(hào)。
  • SIGTSTP(20):?終端停止信號(hào)。
  • SIGTTIN(21):?后臺(tái)進(jìn)程嘗試讀終端信號(hào)。
  • SIGTTOU(22):?后臺(tái)進(jìn)程嘗試寫終端信號(hào)。
  • SIGURG(23):?緊急情況信號(hào)。
  • SIGXCPU(24):?超出CPU時(shí)間限制信號(hào)。
  • SIGXFSZ(25):?超出文件大小限制信號(hào)。
  • SIGVTALRM(26):?虛擬定時(shí)器信號(hào)。
  • SIGPROF(27):?專用定時(shí)器信號(hào)。
  • SIGWINCH(28):?窗口大小改變信號(hào)。
  • SIGIO(29):?異步IO信號(hào)。
  • SIGPWR(30):?電源故障信號(hào)。
  • SIGSYS(31):?非法系統(tǒng)調(diào)用信號(hào)。

? 通過上述Ctrl+C來終止當(dāng)前的進(jìn)程,那么這里會(huì)有一個(gè)疑問:進(jìn)程為什么能夠識(shí)別出用戶所發(fā)送的信號(hào)呢?下面會(huì)給出一些結(jié)論。

1、3 信號(hào)+進(jìn)程所得的初識(shí)結(jié)論

? 同我們上述所列舉的生活中的信號(hào)和Liunx下的信號(hào),我們大概也能知道以下結(jié)論:

  • 進(jìn)程要處理信號(hào),必須具備信號(hào)“識(shí)別”的能力(看到+處理動(dòng)作)。
  • 憑什么進(jìn)程能夠“識(shí)別”信號(hào)呢?原因是由于操作系統(tǒng)提供了信號(hào)處理機(jī)制,通過注冊和處理信號(hào)處理函數(shù),進(jìn)程可以對(duì)不同的信號(hào)做出相應(yīng)的響應(yīng)和處理。根本上就是程序員已經(jīng)在底層都處理好了。
  • 信號(hào)產(chǎn)生是隨機(jī)的,進(jìn)程可能正在忙自己的事情,所以,信號(hào)的后續(xù)處理,可能不是立即處理的!
  • 進(jìn)程會(huì)臨時(shí)的記錄下對(duì)應(yīng)的信號(hào),方便后續(xù)進(jìn)行處理。
  • 在什么時(shí)候處理呢?合適的時(shí)候。(下文會(huì)詳細(xì)解釋)
  • 一般而言,信號(hào)的產(chǎn)生相對(duì)于進(jìn)程而言是異步的。

? 什么是異步呢?異步是指事件的發(fā)生和處理是相互獨(dú)立、不同步進(jìn)行的。在計(jì)算機(jī)編程中,異步操作指的是程序在執(zhí)行某個(gè)操作時(shí),不需要等待該操作完成,而可以繼續(xù)執(zhí)行下面的代碼,在操作完成后通過回調(diào)或其他方式得到結(jié)果。

? 舉例來說,假設(shè)有一個(gè)在線聊天應(yīng)用程序,用戶可以發(fā)送消息給其他用戶。當(dāng)用戶發(fā)送一條消息時(shí),常見的做法是通過網(wǎng)絡(luò)將消息發(fā)送給接收方,然后等待接收方的響應(yīng),最后再執(zhí)行下一步操作。

? 但如果使用異步的方式,則用戶在發(fā)送消息之后可以繼續(xù)進(jìn)行其他操作,而不需要等待對(duì)方的響應(yīng)。一旦對(duì)方接收到消息并做出處理,系統(tǒng)會(huì)通知發(fā)送方消息已經(jīng)成功發(fā)送,或者提供相應(yīng)的錯(cuò)誤信息。

? 這種異步的方式可以提高用戶體驗(yàn),因?yàn)橛脩舨恍枰恢钡却僮鞯耐瓿?#xff0c;可以同時(shí)進(jìn)行其他操作。同時(shí)也可以提高系統(tǒng)的并發(fā)性能,充分利用計(jì)算資源。

? 在編程中,常見的異步操作包括網(wǎng)絡(luò)請(qǐng)求、文件讀寫、數(shù)據(jù)庫操作等。通過使用異步操作,可以避免因阻塞等待而導(dǎo)致程序性能下降或產(chǎn)生無響應(yīng)的情況,提升程序的效率和響應(yīng)速度。

二、信號(hào)的產(chǎn)生

? 我們大概了解信號(hào)的概念后,再來看一下信號(hào)都是在哪些情況下產(chǎn)生的。在Linux下,信號(hào)可以由多種方式產(chǎn)生。以下是一些常見的信號(hào)產(chǎn)生方式:

  1. 用戶通過終端輸入:例如按下Ctrl+C鍵產(chǎn)生的SIGINT信號(hào),用于中斷進(jìn)程的執(zhí)行。
  2. 硬件異常:當(dāng)發(fā)生硬件故障或錯(cuò)誤時(shí),操作系統(tǒng)會(huì)發(fā)送相應(yīng)的信號(hào)給進(jìn)程,例如當(dāng)前進(jìn)程執(zhí)行了除以0的指令,CPU的運(yùn)算單元會(huì)產(chǎn)生異常,內(nèi)核將這個(gè)異常解釋 為SIGFPE信號(hào)發(fā)送給進(jìn)程。再比如當(dāng)前進(jìn)程訪問了非法內(nèi)存地址,MMU會(huì)產(chǎn)生異常,內(nèi)核將這個(gè)異常解釋為SIGSEGV信號(hào)發(fā)送給進(jìn)程。
  3. 軟件條件:進(jìn)程可以根據(jù)滿足特定條件時(shí)發(fā)送信號(hào)給自己或其他進(jìn)程。本篇文章主要介紹alarm函數(shù) 和SIGALRM信號(hào)。
  4. 系統(tǒng)調(diào)用:某些系統(tǒng)調(diào)用可以觸發(fā)信號(hào)。例如,kill命令是調(diào)用kill函數(shù)實(shí)現(xiàn)的。kill函數(shù)可以給一個(gè)指定的進(jìn)程發(fā)送指定的信號(hào)。

? 下面會(huì)對(duì)每種產(chǎn)生信號(hào)的方式進(jìn)行詳解。

2、1?用戶通過終端輸入產(chǎn)生信號(hào)

2、1、1 理解組合鍵變成信號(hào)

? 上述了解到了:Ctrl+C產(chǎn)生(2)SIGINT信號(hào)。但是組合鍵怎么就變成信號(hào)了呢

? 我們可以簡單了理解為:Ctrl+C產(chǎn)生SIGINT信號(hào)的行為只是命令行界面中的一種約定。具體是:用戶按下Ctrl+C后,鍵盤輸入產(chǎn)生一個(gè)硬件中斷,被OS獲取(OS能識(shí)別我們所輸入的組合鍵),解釋成信號(hào),發(fā)送給目標(biāo)前臺(tái)進(jìn)程,前臺(tái)進(jìn)程因?yàn)槭盏叫盘?hào),進(jìn)而引起進(jìn)程退出。

? 在上述的情況中,我們知道了操作系統(tǒng)解釋完后將信號(hào)發(fā)送給了進(jìn)程。那么信號(hào)是保存在哪里呢?答案是對(duì)應(yīng)進(jìn)程的數(shù)據(jù)結(jié)構(gòu)位圖中!下文也會(huì)對(duì)此進(jìn)行詳解。那么發(fā)送信號(hào)的本質(zhì)是操作系統(tǒng)向進(jìn)程中寫信號(hào),不就是修改對(duì)應(yīng)的進(jìn)程控制塊(PCB)中的內(nèi)核位圖數(shù)據(jù)結(jié)構(gòu)嗎!!!

2、1、2 驗(yàn)證ctrl + c 對(duì)應(yīng)?(2)SIGINT信號(hào) (signal()函數(shù))

? 在驗(yàn)證之前,我們先來學(xué)習(xí)一下signal()函數(shù)的使用。signal()函數(shù)是一個(gè)用于處理信號(hào)的函數(shù),它允許我們定義信號(hào)處理程序來捕獲和處理系統(tǒng)中產(chǎn)生的各種信號(hào)。具體如下圖:

下面是signal()函數(shù)的參數(shù)解釋:signumhandlerSIGINT

參數(shù):

  1. signum:表示要捕獲或處理的信號(hào)編號(hào)。例如,SIGINT表示鍵盤中斷信號(hào)。
  2. handler:表示信號(hào)處理程序的指針。它可以是一個(gè)指向函數(shù)的指針,也可以是某些特定的常量。我們也可以自定義handler。
    • 如果handler的值為SIG_IGN,表示忽略對(duì)該信號(hào)的處理。
    • 如果handler的值為SIG_DFL,表示使用默認(rèn)的信號(hào)處理方式

? 我們在對(duì)第二參數(shù)進(jìn)行解釋一下。在上文中也提到過信號(hào)的處理方式:1、默認(rèn)。2、忽略。3、自定義捕捉。當(dāng)我們傳入自定義函數(shù)時(shí),該信號(hào)就會(huì)進(jìn)行自定義捕捉。

? 下面是一個(gè)詳細(xì)的示例使用signal函數(shù)來驗(yàn)證ctrl + c 對(duì)應(yīng)?(2)SIGINT信號(hào) :?

#include <stdio.h>
#include <stdlib.h>
#include <signal.h>
#include <unistd.h>void signal_handler(int signum) {printf("Received signal: %d\n", signum);
}int main() {// 設(shè)置信號(hào)處理函數(shù)signal(SIGINT, signal_handler);printf("Signal handling example. Press Ctrl+C to send a SIGINT signal.mypid:%d\n",getpid());// 進(jìn)入一個(gè)循環(huán),在循環(huán)中不進(jìn)行任何操作,等待信號(hào)發(fā)生while(1){sleep(1);}return 0;
}

在這個(gè)示例中,我們定義了一個(gè)信號(hào)處理函數(shù)signal_handler,該函數(shù)在收到信號(hào)時(shí)會(huì)被調(diào)用,并打印接收到的信號(hào)編號(hào)。

? 接下來,在主函數(shù)main中,我們通過調(diào)用signal函數(shù)來設(shè)置對(duì)SIGINT信號(hào)(即Ctrl+C)的處理方式。將signal(SIGINT, signal_handler)作為參數(shù)傳遞給signal函數(shù),表示在接收到SIGINT信號(hào)時(shí),調(diào)用signal_handler函數(shù)進(jìn)行處理。

? 然后,我們輸出一個(gè)提示信息,并進(jìn)入一個(gè)無限循環(huán),在循環(huán)中不進(jìn)行任何操作,只是通過sleep函數(shù)暫停一秒鐘,等待信號(hào)的發(fā)生。

? 當(dāng)我們在運(yùn)行程序時(shí),按下Ctrl+C組合鍵,會(huì)發(fā)送SIGINT信號(hào)。這時(shí),由于我們設(shè)置了對(duì)SIGINT信號(hào)的處理方式為調(diào)用signal_handler函數(shù),所以程序會(huì)輸出"Received signal: 2"(2為SIGINT的信號(hào)編號(hào))的消息,并且程序也不會(huì)終止。表示成功捕獲并處理了SIGINT信號(hào)。具體如下圖:

? signal函數(shù),僅僅是修改進(jìn)程對(duì)特定信號(hào)的后續(xù)處理動(dòng)作,不是直接調(diào)用對(duì)應(yīng)的處理動(dòng)作。如果后續(xù)沒有任何SIGINT信號(hào)產(chǎn)生,signal_handler會(huì)不會(huì)被調(diào)用呢?答案是永遠(yuǎn)也不會(huì)被調(diào)用。當(dāng)只有SIGINT信號(hào)產(chǎn)生時(shí),才會(huì)調(diào)用signal_handler函數(shù)。

2、2 核心轉(zhuǎn)儲(chǔ)(拓展)

? 在Linux下,我們可通過指令:man 7 signal ,來查看信號(hào)的詳細(xì)信息。如下圖:

? 我們直觀的看到,Action中有:Term、Core、Ign、Cont、Stop。在其中主要是Term、Core兩種。Term 就是終止的意思。那么Core呢?Core也是有終止的意思,但是在終止進(jìn)程前,還會(huì)生成一個(gè)核心轉(zhuǎn)儲(chǔ)(core dump)文件。

? 我們在進(jìn)程等待(進(jìn)程的控制(進(jìn)程退出+進(jìn)程等待))中提到過,但是并沒有進(jìn)行詳細(xì)解釋。具體如下圖:

? 那么回到我們的問題:核心存儲(chǔ)是什么呢?用來干什么的呢?我們接著往下看。

??核心轉(zhuǎn)儲(chǔ)(core dump)是指在計(jì)算機(jī)系統(tǒng)中,當(dāng)發(fā)生嚴(yán)重錯(cuò)誤或異常情況導(dǎo)致程序無法正常運(yùn)行時(shí),系統(tǒng)會(huì)將程序當(dāng)前的內(nèi)存狀態(tài)和相關(guān)信息保存到一個(gè)磁盤文件中,該文件就被稱為核心轉(zhuǎn)儲(chǔ)文件(core dump file)。核心轉(zhuǎn)儲(chǔ)文件包含了程序崩潰時(shí)的堆棧信息、寄存器狀態(tài)、全局變量值等關(guān)鍵信息。通過分析核心轉(zhuǎn)儲(chǔ)文件,可以幫助開發(fā)人員或調(diào)試人員確定程序崩潰的原因和位置,并進(jìn)行問題排查和調(diào)試。

? 但是,在我們的云服務(wù)器上,核心存儲(chǔ)功能是被關(guān)閉的。一個(gè)進(jìn)程允許產(chǎn)生多大的core文件取決于進(jìn)程的Resource Limit(這個(gè)信息保存 在PCB中)。默認(rèn)是不允許產(chǎn)生core文件的,因?yàn)閏ore文件中可能包含用戶密碼等敏感信息,不安全。在開發(fā)調(diào)試階段可以用ulimit命令改變這個(gè)限制,允許產(chǎn)生core文件。
? 當(dāng)然,我們可先查看一下是否能夠形成核心存儲(chǔ)文件。指令為:ulimit -a。如下圖:

? 默認(rèn)核心存儲(chǔ)文件最大為0kb。是不可生成的??梢酝ㄟ^指令:ulimit -c 10240 ,來修改默認(rèn)核心存儲(chǔ)文件的最大值。具體如下圖:

? 我們就行 (3)?SIGQUIT信號(hào)來測試。代碼如下:

#include <stdio.h>
#include <stdlib.h>
#include <signal.h>
#include <unistd.h>
int main() {// 設(shè)置信號(hào)處理函數(shù)signal(SIGQUIT, SIG_DFL);// 進(jìn)入一個(gè)循環(huán),在循環(huán)中不進(jìn)行任何操作,等待信號(hào)發(fā)生while(1){sleep(1);}return 0;
}

? 信號(hào)(3)?SIGQUIT 所對(duì)應(yīng)的組合鍵為 ctrl+‘\’。我們來看一下運(yùn)行結(jié)果:

? 為了讓結(jié)果更加直觀,我們不放創(chuàng)建子進(jìn)程,然后用特殊的方式讓子進(jìn)程退出,再將子進(jìn)程的退出信號(hào)和core dump 標(biāo)志打印出來。具體結(jié)合下圖和代碼理解:

int main()
{pid_t id = fork();if(id == 0){cout << "i am child:" << getpid()<< endl;sleep(1);int a = 100;a /= 0;exit(0);}cout<<"i am father:"<<getpid()<<endl;int status = 0;waitpid(id, &status, 0);cout << "父進(jìn)程:" << getpid() << " 子進(jìn)程:" << id << \ " exit sig: " << (status & 0x7F) << " is core: " << ((status >> 7) & 1) << endl;return 0;
}

? 上述代碼中有一個(gè)除0錯(cuò)誤。而它發(fā)生時(shí),會(huì)產(chǎn)生(8)SGIGFPE 信號(hào),也會(huì)發(fā)生核心轉(zhuǎn)儲(chǔ)。運(yùn)行結(jié)果如下:

? 我們看到了退出信號(hào)確實(shí)為8,且core dump標(biāo)記為變成1。表示發(fā)生了核心轉(zhuǎn)儲(chǔ)。那么生成的核心轉(zhuǎn)儲(chǔ)文件有什么用呢?我們可通過調(diào)試,加載核心轉(zhuǎn)儲(chǔ)文件后可直接看到所對(duì)應(yīng)的錯(cuò)誤信息。指令是:core-file core.27736。具體如下圖:

2、3 系統(tǒng)調(diào)用接口產(chǎn)生信號(hào)

? 如何理解系統(tǒng)調(diào)用接口產(chǎn)生信號(hào)呢?首先是我們用戶進(jìn)行系統(tǒng)調(diào)用接口,然后操作系統(tǒng)會(huì)執(zhí)行對(duì)應(yīng)的系統(tǒng)代碼。其中操作系統(tǒng)會(huì)自動(dòng)提取我們所傳入的參數(shù),再向目標(biāo)進(jìn)程寫信號(hào)。也就是修改對(duì)應(yīng)進(jìn)程的位圖數(shù)據(jù)結(jié)構(gòu)。最后進(jìn)程會(huì)進(jìn)行相關(guān)的處理操作。

? 系統(tǒng)調(diào)用接口也可用于產(chǎn)生各種不同類型的信號(hào)。下面列舉了幾個(gè)常見的系統(tǒng)調(diào)用接口,它們可用于產(chǎn)生不同的信號(hào):

  1. kill(pid, sig): 這個(gè)系統(tǒng)調(diào)用接口用于向指定進(jìn)程發(fā)送SIGKILL信號(hào)。通過指定pid參數(shù)為目標(biāo)進(jìn)程的進(jìn)程ID,通過sig參數(shù)指定要發(fā)送的信號(hào)。

  2. raise(sig): 這個(gè)系統(tǒng)調(diào)用接口用于向當(dāng)前進(jìn)程自身發(fā)送信號(hào)。通過指定sig參數(shù)來選擇要發(fā)送的信號(hào)。

  3. abort():SIGABRT可以被捕捉,但是捕捉之后依然會(huì)讓進(jìn)程終止,這就是SIGABRT的特點(diǎn)就像exit函數(shù)一樣,abort函數(shù)總是會(huì)成功的,所以沒有返回值。

  4. sigaction(sig, new_action, old_action): 這個(gè)系統(tǒng)調(diào)用接口用于設(shè)置信號(hào)處理程序。通過指定sig參數(shù)表示要設(shè)置的信號(hào),通過new_action參數(shù)傳遞新的信號(hào)處理程序,通過old_action參數(shù)獲取之前的信號(hào)處理程序。

? 下文我們也會(huì)用到系統(tǒng)調(diào)用接口產(chǎn)生相應(yīng)的信號(hào)。

2、4 軟件條件產(chǎn)生信號(hào)

? 當(dāng)一個(gè)程序通過軟件條件產(chǎn)生信號(hào)時(shí),它可以通知其他程序或系統(tǒng)內(nèi)核發(fā)生了某個(gè)特定的事件或狀態(tài)的改變。以下是一個(gè)例子來詳細(xì)解釋這個(gè)過程:

? 假設(shè)我們有一個(gè)服務(wù)管理程序,該程序負(fù)責(zé)監(jiān)控某個(gè)服務(wù)器上的各種服務(wù)的運(yùn)行情況。服務(wù)管理程序需要檢查每個(gè)服務(wù)是否正常運(yùn)行,如果發(fā)現(xiàn)某個(gè)服務(wù)停止工作,它應(yīng)該發(fā)送一個(gè)信號(hào)給系統(tǒng)管理員,以便及時(shí)采取措施解決問題。

? 下面我們來看一個(gè)用alarm產(chǎn)生信號(hào)。代碼如下:

typedef function<void ()> func;
vector<func> callbacks;uint64_t count = 0;void showCount()
{// cout << "進(jìn)程捕捉到了一個(gè)信號(hào),正在處理中: " << signum << " Pid: " << getpid() << endl;cout << "final count : " << count << endl;
}
void showLog()
{cout << "這個(gè)是日志功能" << endl;
}
void logUser()
{if(fork() == 0){execl("/usr/bin/who", "who", nullptr);exit(1);}wait(nullptr);
}void catchSig(int signum)
{for(auto &f : callbacks){f();}alarm(1);
}
static void Usage(string proc)
{cout << "Usage:\r\n\t" << proc << " signumber processid" << endl;
}int main(int argc, char *argv[])
{signal(SIGALRM, catchSig);callbacks.push_back(showCount);callbacks.push_back(showLog);callbacks.push_back(logUser);alarm(1);while(true) count++;return 0;
}

??這段代碼是一個(gè)示例程序,它使用了信號(hào)處理、回調(diào)函數(shù)和進(jìn)程控制相關(guān)的操作。下面對(duì)代碼進(jìn)行詳細(xì)解釋:

  1. 首先,定義了一個(gè)函數(shù)指針類型func,該類型表示一個(gè)無返回值、無參數(shù)的函數(shù)。
  2. 創(chuàng)建了一個(gè)名為callbacks的向量(vector),用于存儲(chǔ)回調(diào)函數(shù)。
  3. 定義了一個(gè)名為count的64位整數(shù)變量,初始值為0。
  4. 定義了三個(gè)函數(shù):showCount()、showLog()logUser(),分別用于顯示count的值、打印日志和查看當(dāng)前登錄用戶。
  5. catchSig()函數(shù)用于捕獲信號(hào),并依次調(diào)用存儲(chǔ)在callbacks中的回調(diào)函數(shù)。在本例中,catchSig()會(huì)被設(shè)置成SIGALRM信號(hào)的處理函數(shù)。
  6. Usage()函數(shù)用于顯示程序的使用方法。
  7. main()函數(shù)中,首先注冊了SIGALRM信號(hào)的處理函數(shù)為catchSig()
  8. 接下來,將showCount()、showLog()logUser()這三個(gè)函數(shù)添加到callbacks中。
  9. 調(diào)用alarm(1)函數(shù),設(shè)置一個(gè)定時(shí)器,每隔1秒鐘觸發(fā)一次SIGALRM信號(hào),從而調(diào)用catchSig()函數(shù)。
  10. 使用一個(gè)無限循環(huán),不斷遞增count的值。

? 整個(gè)程序的運(yùn)行過程如下:

  1. 注冊SIGALRM信號(hào)處理函數(shù)catchSig()。
  2. showCount()、showLog()logUser()這三個(gè)函數(shù)添加到callbacks中。
  3. 調(diào)用alarm(1)設(shè)置定時(shí)器,1秒后觸發(fā)SIGALRM信號(hào),并調(diào)用catchSig()函數(shù)。
  4. catchSig()函數(shù)中,依次調(diào)用存儲(chǔ)在callbacks中的函數(shù)。
  5. showCount()函數(shù)會(huì)顯示當(dāng)前count的值,showLog()函數(shù)會(huì)打印日志信息,logUser()函數(shù)會(huì)通過創(chuàng)建子進(jìn)程調(diào)用/usr/bin/who命令查看當(dāng)前登錄用戶。
  6. 定時(shí)器再次啟動(dòng),繼續(xù)循環(huán)執(zhí)行。

2、5 由硬件異常產(chǎn)生信號(hào)

? 除0錯(cuò)誤就是硬件異常。包括對(duì)野指針的訪問修改,也是硬件異常產(chǎn)生信號(hào)來終止程序的。

? 為什么說除0是硬件異常錯(cuò)誤呢?所有的計(jì)算操作都是在cpu中進(jìn)行的,cpu中有一個(gè)狀態(tài)寄存器(對(duì)外是不可見的,也是不可被修改的),寄存器內(nèi)有對(duì)應(yīng)的狀態(tài)標(biāo)記位(溢出標(biāo)記位)。OS會(huì)自動(dòng)進(jìn)行計(jì)算完畢之后的檢測的!如果溢出標(biāo)記位是1,OS里面識(shí)別到有溢出問題,立即只要找到當(dāng)前誰在運(yùn)行提取PID,OS完成信號(hào)發(fā)送的過程,進(jìn)程會(huì)在合適的時(shí)候,進(jìn)行處理即可。

? 如何理解野指針或者越界問題呢?

??首先都必須通過地址,找到目標(biāo)位置。我們語言上面的地址,全部都是虛擬地址。將虛擬地址轉(zhuǎn)成物理地址。轉(zhuǎn)換的過程中需要通過頁表+MMU(Memory Manager Unit,硬件! ! )。在轉(zhuǎn)換時(shí),發(fā)現(xiàn)野指針是越界訪問或者非法地址。MMU轉(zhuǎn)化的時(shí)候,一定會(huì)報(bào)錯(cuò)!此時(shí)就會(huì)發(fā)出信號(hào)來終止程序

? 注意:一旦出現(xiàn)硬件異常,進(jìn)程一定會(huì)退出嗎?不一定!一般默認(rèn)是退出,但是我們即便不退出,我們也做不了什么。當(dāng)我們不退出時(shí),但也并沒有對(duì)異常進(jìn)行任何修改,寄存器中任然保留異常。則會(huì)進(jìn)入死循環(huán)報(bào)錯(cuò)。

三、總結(jié)

? 本篇文章詳細(xì)解釋了信號(hào)是怎么產(chǎn)生的。并且知道了寫信號(hào)的本質(zhì)就是修該進(jìn)程控制塊內(nèi)容等等。

? 而我們還留下了一系列問題:在合適的時(shí)候會(huì)處理信號(hào)。這里的合適的時(shí)候具體是什么呢?同時(shí)信號(hào)的保存還有很多細(xì)節(jié)沒有講解。還有最后的信號(hào)處理工作也沒有詳解。我們會(huì)在下篇文章進(jìn)行詳細(xì)解釋!!!感謝閱讀ovo~

http://www.risenshineclean.com/news/33349.html

相關(guān)文章:

  • 做網(wǎng)站優(yōu)化有用嗎百度廣告公司聯(lián)系方式
  • 電腦手機(jī)網(wǎng)站制作網(wǎng)站免費(fèi)優(yōu)化
  • ps做網(wǎng)站的流程2023年8月份新冠
  • 專業(yè)網(wǎng)絡(luò)推廣公司排名北京推廣優(yōu)化經(jīng)理
  • 成都網(wǎng)站注冊域名注冊后如何建網(wǎng)站
  • 點(diǎn)擊未來網(wǎng)站建設(shè)游戲代理
  • 新手做網(wǎng)站的詳細(xì)步驟網(wǎng)站友鏈
  • 北京做網(wǎng)站定制價(jià)格seo診斷服務(wù)
  • 1688運(yùn)營自學(xué)全套教程seo網(wǎng)站推廣工具
  • 蘇州吳中區(qū)做網(wǎng)站新東方教育培訓(xùn)機(jī)構(gòu)官網(wǎng)
  • wordpress恢復(fù)分類目錄seo營銷論文
  • 自動(dòng)化東莞網(wǎng)站建設(shè)北京疫情最新消息
  • 網(wǎng)站開發(fā)視頻壓縮上傳seo資源
  • 旅游網(wǎng)站在提高用戶體驗(yàn)方面應(yīng)做哪些工作長春網(wǎng)站建設(shè)制作
  • 做吃的教程網(wǎng)站品牌整合營銷方案
  • 典型網(wǎng)站開發(fā)的一般流程推廣app是什么工作
  • 好看網(wǎng)站手機(jī)版批量查詢權(quán)重
  • 網(wǎng)站建設(shè)php帶數(shù)據(jù)庫模板網(wǎng)絡(luò)安全
  • 如何做網(wǎng)站鏡像百度鏈接提交入口
  • 手機(jī)網(wǎng)站有哪些類型成都網(wǎng)絡(luò)推廣
  • 網(wǎng)站建設(shè) 開發(fā)網(wǎng)站代碼百度網(wǎng)盤官網(wǎng)
  • 怎么用家里的電腦做網(wǎng)站服務(wù)器上海seo公司排名
  • 學(xué)校網(wǎng)站建設(shè)的優(yōu)勢和不足成人用品推廣網(wǎng)頁
  • 陽春網(wǎng)站制作寧波網(wǎng)站建設(shè)推廣平臺(tái)
  • 個(gè)人網(wǎng)站 備案 廣告seo搜索引擎優(yōu)化價(jià)格
  • 72搭建網(wǎng)站網(wǎng)頁代引流推廣公司
  • 想開個(gè)網(wǎng)站賣衣服的怎么做常州seo收費(fèi)
  • 有交做拼多多網(wǎng)站的嗎產(chǎn)品推廣平臺(tái)有哪些
  • 自己做網(wǎng)站賣什么海南樂秀同城群軟件下載
  • 做網(wǎng)站公司南京關(guān)鍵詞免費(fèi)網(wǎng)站