信号_什么是信号_学习信号有什么意义
什么是信號,學習信號有什么意義
第7章 信號
我們這里講的信號指的是OS提供的一種軟件層面的通信進制,大家不要和電子專業的“電信號”搞混。
1. 什么是信號
信號是一種通知進程某件事情發生了的一種通信機制,通過向進程發送某個信號,可以告訴進程發生了什么事情,進程收到這個信號后,就知道某事情發生了。進程可以做出相應的響應(處理),所以其實信號也是一種通信機制,目的就是用于告訴進程發生了什么事情。
不過Linux所實現的信號這種通信機制,與我們后面專門將的IPC(進程間通信)所不同的是,信號屬于不精確通信,信號只能告訴進程大概發生了什么事情,但是不能準確的告訴進程詳細的細節信息。
這就好比以前長城放狼煙一樣,放狼煙就是一種信號,只能告訴你敵人來了,大概來了多少人,但是無法告訴更多詳細的情報,但是如果是電話、電報的話,就屬于精確通信,不經可以告訴你敵人來了,還會告訴你敵軍的詳細情況。
是不是有了精確的IPC后,就可以將信號淘汰了呢?顯然不是的,信號有自己應用場合。
本章所涉及到各個API就是專門與信號相關的API
2. 學習信號的意義
(1)后續課程和開發會用到
(2)幫助我們解答一些疑惑
1) 比如Ctrl+C為什么可以結束進程
2) 產生指針錯誤是為什么進程能夠自動結束,并提示產生了“segment fault”(段錯誤)。
3)kill命令到底是怎么結束進程的。
等等
(3)有利于知識的橫向對比和理解
C、C++、Java的線程庫有類似的信號概念,QT界面開發使有類似信號和槽的概念,如果你對本章介紹Linux的信號機制有所理解的話,你會發現其實所有的信號機制的實現,原理都是相通的。
1. 信號
1.1 什么是信號
信號是一種向進程發送通知,告訴其某件事發生了的一種簡單通信機制
1.2 信號的命名
Linux中定義了很多信號,所有的信號都是一個整數編號,不過為了好辨識,Linux系統給這些整數編號都定義了對應的宏名,宏名都是以SIG開頭,比如SIGABRT。
SIG:signal的縮寫
ABRT:abort的縮寫
宏名SIG , 是對信號的描述,ABRT標識放棄的意思,向進程發送SIGABRT信號,進程會被信號異常終止。在前面我們講過,當我們調用abort函數是,該函數就會向進程發送一個SIGABRT信號,你一看到ABRT就知道與abort函數有關系。
疑問:這么多的信號,都有哪些呢?記不住怎么辦?
答:不用擔心,后面解釋。
1.3 誰會向進程發送信號
總結起來,會有三個角色會向進程發送信號。另一個進程、OS內核、硬件中斷。
(1)另一個進程發送信號
比如在命名行終端窗口通過kill命令向某個進程發送一個信號將其終止。
(2)內核發送信號
發生了某個事件,Linux內核可能會發送該事件對應的信號給某個進程
進程從管道文件讀取數據,但是管道文件的讀權限被關閉了,進程會被內核發送一個SIGPIPE信號,提示讀管道出錯了。
(3)地城硬件發送信號
底層硬件發生了某個事件,會向進程發送對應的某個信號。
比如按下Ctrl+C按鍵終止進程時,內核收到Ctrl+C按鍵后,會向正在運行的進程發送SIGINT信號,將其異常終止。
1.4 進程收到信號過后,進程會如何處理
三種處理方式,分別是默認,忽略,捕獲。
1.4.1 忽略
忽略的意思就是,進程就到信號沒有發生過。
這就好比別人送了新給你,但是你忽略信的存在,那么這封信將不會對你產生任何影響。
1.4.2 捕獲
捕獲的意思就是說,進程會調用響應的處理函數,進行響應的處理。
1.4.3 默認
如果不忽略也不捕獲的話,此時進程會使用系統默認的處理方式來處理信號。
總結
以上是生活随笔為你收集整理的信号_什么是信号_学习信号有什么意义的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 关于内存类型 UDIMM、RDIMM、L
- 下一篇: QT中的线程与事件循环理解(2)