UNIX环境C - 系统信号
一.信號的概念
信號就是一種軟中斷,進程與進程之間信號的傳遞,都是通過內(nèi)核來當做中轉(zhuǎn)站的,不能直接傳遞信號。
二、信號的分類(128位信號,不過可用信號就1~64除去32與33)
1.不可靠信號(SIGHUP(1)~SIGSYS(31)):由于他是非實時信號,所以他會產(chǎn)生多次信號,但不支持排隊,并且只接受一次,因此信號有可能丟失,所以是不可靠信號。
2.可靠信號(SIGRGMI(34)~SIGRTMAX(64)):由于他是實時信號,如果他產(chǎn)生多次信號,他會進行排隊,信號會被全盤接受,信號不會丟失,所以是可靠信號。
三、信號的捕獲與處理
1.signal函數(shù)會注冊一個信號處理函數(shù),需要在程序開始時初始化,如果程序接受到信號時,這個函數(shù)就會啟用。
2.用fork函數(shù)創(chuàng)建的子進程會繼承父進程的信號處理方式,當vfork和exec組成而創(chuàng)建的子進程不會繼承父進程的信號處理方式。
四、信號的發(fā)送
1.終端發(fā)送:kill? -sig? pid ? ? ? ? ? ? ? ?? 2.函數(shù)調(diào)用:int ? kill(pid_t pid,int sig)
3.有關(guān)時間的信號
a.睡眠(pause):沒有時間的限制,只有收到不可忽略的信號時,才會結(jié)束此函數(shù),如果有信號處理函數(shù),先執(zhí)行信號處理函數(shù),再返回-1
b.睡眠(sleep):可手動控制時間的函數(shù),若收到信號,則返回剩余的秒數(shù),如沒收到信號,則等時間過完,返回0
c.時鐘(alarm):鬧鐘一般需要與pause函數(shù)結(jié)合使用,當度過所設定的時間是,會返回一個SIGALRM信號,默認處理直接退出。
? ? ?
五、信號屏蔽
1.信號集
a.信號集的創(chuàng)建
1)創(chuàng)建信號集? sigset_t*? set
2)? 填滿信號集? sigfillset(sigset_t*? set)
3)清空信號集 ?sigemptyset(sigset_t*? set)
4)向信號集中添加信號 ??sigaddset(sigset_t*? set,int? signal)
5)向信號集中刪除信號 sigdelset(sigset_t*? set,int siganl)
6)? 測試信號集中的信號 ?? sigismember(const ? sigset_t*? set,int signal)
? ? 2.屏蔽信號(signal mask)
每一個進程都有一個屏蔽掩碼 , 里面包含了進程的屏蔽信號。
信號的屏蔽不是選擇不接受信號,而是延時接受信號。
? ? ? 延時接受:設置屏蔽掩碼的目的是為了防止程序在進程一些敏感操作時,被打斷。當處理完敏感操作后,就會接受信號。可靠信號會排隊接受,不可靠信號只接受一次。
int signprocmask(int how,const sigset_t *set,sigset_t * oldset)
? ? ? ? ? ? ? ? ? 功能:設置進程的信號掩碼(信號屏蔽碼)
? ? ? ? ? ? ? ? ? ?? how:修改信號掩碼的方式
? ? ? ? ? ? ? ? ? ? ? ? ? ? SIG_BLOCK:向信號掩碼中添加信號
? ? ? ? ? ? ? ? ? ? ? ? ? ? SIG_UNBLOCK:從信號掩碼中刪除信號
? ? ? ? ? ? ? ? ? ? ? ? ? ? SIG_SETMASK:用新的信號集替換舊的信號掩碼
? ? ? ? ? ? ? ? ? ? newset:新添加、刪除、替換的信號集,也可以為空
? ? ? ? ? ? ? ? ? ? oldset:獲取舊的信號掩碼
? ? ? ? ? ? int ?sigpending(sigset_t *set)
??????? ? 功能:獲取未決狀態(tài)的信號 ? ?
六、計時器
? ? ? 操作系統(tǒng)維護了三個計時器
? ? ? ? ? 真實計時器:程序的運行時間
? ? ? ? ? 虛擬計時器:記錄程序在用戶態(tài)耗費的時間
? ? ? ? ? 實用計時器:記錄程序在用戶態(tài)和內(nèi)核態(tài)耗費的時間和
? ? ? ? ? 真實 ?= ?實用 ?+ ?進出的耗費 ?+ ?休眠。
? ? ? ? ? int getitimer(int which, struct itimerval *curr_value);
? ? ? ?? 功能:獲取之間設置的定時任務
? ? ? ?? which:計時器的類型
? ? ? ? ? ? ? ? ? ITIMER_REAL :真實時間,信號是:SIGALRM
? ? ? ? ? ? ? ? ? ITIMER_VIRTUAL:虛擬,信號:SIGVTALEM
? ? ? ? ? ? ? ? ? ITIMER_PROF :實用,信號:SIGPROF
? ? ? ?? curr_value:
? ? ? ? ? ? ? ? ?? it_interval:時鐘信號的間隔時間
? ? ? ? ? ? ? ? ?? it_value:第一次時鐘信號產(chǎn)生的時間
轉(zhuǎn)載于:https://www.cnblogs.com/goul/p/9368317.html
總結(jié)
以上是生活随笔為你收集整理的UNIX环境C - 系统信号的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: GitHub入门与实践 读书笔记一:欢迎
- 下一篇: (四)建筑物多边形化简系统——“去尾巴”