linux操作系統之信號

(1)信號的概念

? ? ? ? ? ?信號的特點:簡單,不能攜帶大量信息,滿足某種特定條件才觸發。

? ? ? ? ? ?信號的機制;“軟中斷”,通過軟件方式實現,具有很強的延時性。每個進程收到的信號,都由內核負責發送,內核處理

? ? ? ? ? ?信號的產生:1)按鍵產生(ctrl+c,ctrl+z,ctrl+\)

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?2) 系統調用產生(kill,abort,raise)

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?3)軟件條件產生(定時器alarm)

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?4)硬件異常產生((非法訪問內存)段錯誤,(除0)浮點數例外,內存對齊出錯(總線錯誤))

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?5)命令產生(kill)

? ? ? ? ?信號的處理方式:1)執行默認動作

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 1>Term :終止進程? 2>lgn:忽略信號3>core:終止進程(查驗死亡原因,gdb調試)

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 4>Stop:停止(暫停)進程5>Cont:繼續進程

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?2)忽略(舍棄)

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?3)捕捉(掉用戶處理函數)

? ? ? ? ?信號的四要素:編號? 名稱? 事件 默認處理動作

? ? ? ? Linux內核中有一個PCB進程控制塊,是一個結構體,task_struct,里面保存了進程id,狀態,工作目錄,用戶id,用戶組id,文件描述符和阻塞信號集及未決信號集。

? ? ? ?信號的編號:由kill -i查看當前系統可使用的命令,其中1~31為常規信號,34~64為實時信號。

? ? ? ?在31個常規信號中,9)SIGKILL和19)SIGSTOP信號不能被忽略和捕捉,智能執行默認動作,不能設置其為阻塞。

(2)信號的產生

? ? ?1)終端按鍵產生信號:ctrl+c? -->2)SIGINT(終止、中斷)ctrl+z --->20)SIGTSTP(暫時、停止)? ctrl+\--->3)SIGQUIT(退出)

? ? ?2) 硬件產生信號:除零操作-->8)SIGFPE(浮點數例外)? ? ?非法訪問內存-->11)SIGSEGV(段錯誤)? ?總線錯誤 --->7)SIGBUS

? ? ?3)?kill函數或命令產生信號: kill -SIGKILL pid

? ? ? ? ? ? ? int kill(pid_t pid,int sig);? ? ? 成功:0 失敗-1

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?sig:不推薦直接使用數字,應使用宏名。因為不同的操作系統可能編號不一樣,但名稱一致。

? ? ? ? ? ? ? ? pid>0? ?發送信號給指定進程

? ? ? ? ? ? ? ? pid<0? ? 發送信號給調用kill函數同一進程組的所有進程。

? ? ? ? ? ? ? ?pid<0? ? ?取|pid|發給對應進程組

? ? ? ? ? ? ? ?pid=-1? ? 發送給當前用戶組的所有進程? ? ? ? ? ? ? ? ?

? ? ? ? ? ?raise函數:給自己發指定信號? int raise(int sig)==kill(getpid(),sig)

? ? ? ? ? abort函數:給自己發送異常終止信號? 6)SIGABRT信號,終止并產生core文件,void abort(void)

? ? 4)軟件產生信號

? ? ? ? ? ? ?alarm函數:定時固定秒數之后,內核給當前進程發送14)SIGALRM信號,終止進程(每個進程只有一個鬧鐘)? ?

? ? ? ? ? ? ?unsigned int alarm(unsigned int seconds);? 返回0或剩余的秒數(上一次定時剩余的秒數)?alarm(0)取消定時

? ? ? ? ? ? ? ? ? ? ? ? 采用自然定時發,與進程狀態無關

? ? ? ? ? ? setitimer函數:定時可以達到微秒,可實現循環定時。

? ? ? ? ? ? int setitimer(int which,const struct itimerval*new_value,struct itimerval*old_value);

? ? ? ? ? ? ? ? ? ? ?參數which(定時方式):ITIMER_REAL(自然定時法-)-->14)SIGLARM

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?ITIMER_VIRTUAL(虛擬空間計時,用戶時間)---->26)SIGVTALRM

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ITMER_PROF(運行時間計時,用戶+內核)------>27)SIGPROF

? ? ? ? ? ? ? ? ? ?程序實際執行的時間=系統時間+用戶時間+等待時間

? ? ? ? ? ? ? ? ??

? ? ? ? ? ? 其中it_interval為周期定時的時間,it_value為當前定時的時間。

(3)信號集操作函數

? ? ? 內核通過讀取未決信號集來判斷信號是否被處理,信號屏蔽字(阻塞信號集)mask可以影響未決信號集。? ? ? ? ? ??

? ? ? ? ? ?1 )信號集設定

? ? ? ? ? ? ? ?

? ? ? ? 2)sigprocmask函數:屏蔽信號,接觸屏蔽,設置信號集

? ? ? ? ? ? ?int sigprocmask(int how,const sigset_t*set,sigset_t*oldset);

? ? ? ? ? ? ? ? ? ? ? ? ? how:SIG_BLOCK,set表示需要屏蔽的信號

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?SIG_UNBLOCK,set表示需要解屏蔽的信號

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?SIG_SETMASK:set表示需要替代原始的新屏蔽集。

? ? ? ? 3)sigpending函數:獲取當前的未決信號集

? ? ? ? ? ? ? ? ? int sigpending(sigset_t*set);? ? //使用sigsimember來判斷某個信號是否在其中

(4)信號捕捉

? ? ? ? ? ?1)signal函數:注冊一個信號捕捉函數,抓信號由內核進行

? ? ? ? ? ? ? ? ? ? ? typedef void(*sighandler_t)(int);

? ? ? ? ? ? ? ? ? ? ?sighandler_t signal(int signum,sighandler_t handler);

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?參數:signum(捕捉的信號)? handle(處理的函數)

? ? ? ? ?2)sigaction函數:修改信號處理動作

? ? ? ? ? ? ? ? ? ? int sigaction(int signum,const struct sigaction*act,struct sigaction*oldact)

? ? ? ? ? ? ??

? ? ? ? ? ? ? 重點掌握:1>sa_handler:指定的信號捕捉后的處理函數名,可以賦值為SIG_IGN(表示忽略)SIG_DFL(表示執行默認)

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 2>sa_mask:調用信號處理函數時使用的屏蔽信號集(臨時設置,執行完函數即失效)(如果有信號為非屏蔽? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?信號集中的信號,會先處理該信號)

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?3>sa_flags:設置為0,表默認屬性(信號捕捉函數期間,默認屏蔽本信號)

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?阻塞的常規信號不支持排隊,產生多次只記錄一次,捕捉函數執行完之后再執行該阻塞信號。

? ? ? ? ? ? ?其他:第五個信號舍棄不用

? ? ? ? ? ? ? ? ? ? ? ? 當sa_flags==SA_SIGINFO時,使用第二個參數處理程序。

? ? ? ? ? ? 3)內核實現信號捕獲過程

? ? ? ? ? ? ? ? ? ??

?

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/382334.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/382334.shtml
英文地址,請注明出處:http://en.pswp.cn/news/382334.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

redis源碼學習筆記目錄

Redis源碼分析&#xff08;零&#xff09;學習路徑筆記 Redis源碼分析&#xff08;一&#xff09;redis.c //redis-server.c Redis源碼分析&#xff08;二&#xff09;redis-cli.c Redis源碼剖析&#xff08;三&#xff09;——基礎數據結構 Redis源碼剖析&#xff08;四&…

linux操作系統信號捕捉函數之sigaction用法小結

&#xff08;1&#xff09;sigaction函數&#xff1a;注冊一個信號捕捉函數&#xff08;不參與捕捉信號&#xff0c;信號由內核捕捉&#xff09;&#xff0c;并修改原來的信號處理動作 &#xff08;2&#xff09;函數原型及頭文件 頭文件&#xff1a;#include<signal.h>…

redis源碼剖析(十五)——客戶端思維導圖整理

redis源碼剖析&#xff08;十五&#xff09;——客戶端執行邏輯結構整理 加載略慢

linux操作系統信號捕捉函數之回調函數小結

&#xff08;1&#xff09;signal 信號捕捉函數&#xff1a;注冊一個信號捕捉函數&#xff08;不參與捕捉&#xff0c;那是內核的事情&#xff09; 函數實現&#xff1a; typedef void(*sighandler_t)(int); //聲明了一個函數指針&#xff08;代表著一類函數&#xff1a;參…

Redis運維和開發學習筆記-全書思維導圖

Redis運維和開發學習筆記-全書思維導圖 圖片過大&#xff0c;無法上傳。 鏈接:https://pan.baidu.com/s/13pnEMBEdLgjZNOOEAuDvEQ 密碼:qhch

linux操作系統之競態條件(時序競態)

&#xff08;1&#xff09;時序競態&#xff1a;前后兩次運行同一個程序&#xff0c;出現的結果不同。 &#xff08;2&#xff09;pause函數&#xff1a;使用該函數會造成進程主動掛起&#xff0c;并等待信號喚醒&#xff0c;調用該系統調用的進程會處于阻塞狀態&#xff08;主…

linux操作系統之全局異步IO及可重入/不可重入函數

&#xff08;1&#xff09;全局變量異步I/O實現父子進程交替數數 1&#xff09;信號捕捉函數 2&#xff09;main函數實現信號交替 3&#xff09;程序實現 1》創建子進程&#xff0c;父進程等待1s&#xff0c;等待子進程完成捕捉函數注冊&#xff08;捕捉信號SIGUSR1&#xff09…

RDB和AOF速度測試

同一臺機器測試 Redis3.2 Redis5.0.7 Linux python 3.10.0-693.11.1.el7.x86_64 #1 SMP Mon Dec 4 23:52:40 UTC 2017 x86_64 x86_64 x86_64 GNU/Linux rdb測試步驟 1. 修改redis.conf配置文件 開啟rdb(測試aof時&#xff0c;注釋掉rdb&#xff0c;并重啟redis) # save &quo…

LInux操作系統之SIGCHLD信號

&#xff08;1&#xff09;SIGCHLD產生條件 1&#xff09;子進程終止的時候 2&#xff09;子進程接收到SIGSTOP信號停止時 3&#xff09;子進程處于停止狀態&#xff0c;接受到SIGCONT后喚醒 &#xff08;2&#xff09;借助SIGCHLD使用waitpid信號實現父進程對子進程的回收 &a…

rdb和aof到底哪個快

rdb和aof到底哪個快&#xff1f; 大多數情況rdb比aof快&#xff01;取決因素是fsync策略 具體選擇aof還是rdb應根據業務場景選擇。糾結于兩者哪個更快意義不大 測試數據 數據量rdb時間rdb文件大小5000076s1.1M100000197s2.1M150000235s3.1M200000305s4.3M 數據量aof時間ao…

linux操作系統之終端

&#xff08;1&#xff09;終端分類&#xff1a; AltCtrlF1~F6 字符終端 pts :偽終端 AltCtrlF7 圖形終端 SSH&#xff0c;Telnet 網路終端 &#xff08;2&#xff09;終端的啟動流程 每一個進程都可以通過一個特殊的設備文件/dev/tty訪問它的控制終端&#x…

golang實現聊天室(一)

一個簡單的tcp通訊 客戶端發一下&#xff0c;服務端收一下打印 客戶端 func main() {var conn, err net.DialTimeout("tcp", "127.0.0.1:8888", 30*time.Second)if err ! nil {return}conn.Write([]byte("string not "))conn.Close() }服務端 …

linux操作系統之進程組及會話

&#xff08;1&#xff09;進程組&#xff08;作業&#xff09;&#xff1a;代表一個或多個進程的集合。 1)父進程創建子進程時&#xff0c;默認子進程與父進程屬于同一進程組&#xff0c;進程組id第一個進程id(組長id,父進程id)。 2)使用kill -SIGKILL -進程組id(負數&#xf…

golang實現聊天室(二)

golang實現聊天室&#xff08;二&#xff09; 上一篇完成了服務端啟動監聽連接&#xff0c;客戶端建立連接&#xff0c;發一個消息&#xff0c;斷開連接。服務端收一下&#xff0c;然后服務端打印。 客戶端可以一直發送消息&#xff0c;服務端不停接收并打印 client func mai…

golang實現聊天室(三)

golang實現聊天室&#xff08;三&#xff09; 實現多個客戶端同時給服務端發送消息&#xff0c;服務端接受并打印出來 client1 func main() {var conn, err net.DialTimeout("tcp", "127.0.0.1:5888", 30*time.Second)if err ! nil {log.Fatal("conn…

linux操作系統之線程同步及互斥量

&#xff08;1&#xff09;線程同步 1&#xff09;線程同步&#xff1a;指一個線程發出某一個功能運行時&#xff0c;在運行還沒有結束的時候&#xff0c;該調用不返回。同時其它線程為保證數據的一致性&#xff0c;不能調用該功能。 2&#xff09;多個控制流共同操作一個共享資…

golang實現聊天室(四)

golang實現聊天室&#xff08;四&#xff09; 服務端給已經建立連接的客戶端發送消息 client1 func main() {var conn, err net.DialTimeout("tcp", "127.0.0.1:6888", 30*time.Second)if err ! nil {log.Fatal("conn error")}for {conn.Write…

linux操作系統之讀寫鎖

&#xff08;1&#xff09;讀寫鎖&#xff1a;只有一把鎖&#xff0c;但是有兩種狀態&#xff08;讀&#xff0c;寫&#xff09; 1&#xff09;讀寫鎖的三種狀態&#xff1a;讀鎖&#xff0c;寫鎖&#xff0c;不加鎖 2&#xff09;讀寫鎖特性&#xff08;12字&#xff09;&…

golang實現聊天室(五)

golang實現聊天室&#xff08;五&#xff09; 完成服務端廣播消息 server package mainimport ("fmt""log""math/rand""net" )type Client_list struct {list map[net.Conn]string }func main() {client_list : Client_list{make(map…