信号的产生和状态
信號的產生:1.按鍵產生,如:Ctrl+c(內核向進程發送信號,殺死該進程)、Ctrl+z、Ctrl+\;2.系統調用產生,如:kill、raise、abort;3.軟件條件產生,如:定時器alarm;4.硬件異常產生,如:非法訪問內存(段錯誤)、除0(浮點數例外)、內存對齊出錯(總線錯誤);5.命令產生,如:kill命令。
遞達:遞送并且到達進程。
未決:產生和遞達之間的狀態。主要由于阻塞(屏蔽)導致該狀態。
信號的處理方式(內核處理):1.執行默認動作;2.忽略(丟棄);3.捕捉(掉用戶處理函數)。
阻塞信號集(信號屏蔽字)與未決信號集:
Linux內核的進程控制塊PCB是一個結構體,task_struct, 除了包含進程id,狀態,工作目錄,用戶id,組id,文件描述符表,還包含了信號相關的信息,主要指阻塞信號集和未決信號集。未決信號集和阻塞信號集(信號屏蔽字),它們都是一個集合(set,即不重復但是無序)。集合(set)里存儲的是數字(信號編號,從1開始),對應的0表示假,1表示真。即在阻塞信號集中,0表示未阻塞,1表示阻塞。
阻塞信號集(信號屏蔽字):將某些信號加入集合,對他們設置屏蔽,當屏蔽信號后,再收到該信號,該信號的處理將推后(解除屏蔽后)。
未決信號集:1. 信號產生,未決信號集中描述該信號的位立刻翻轉為1,表信號處于未決狀態。當信號被處理對應位翻轉回為0。這一時刻往往非常短暫; 2. 信號產生后由于某些原因(主要是阻塞)不能抵達。這類信號的集合稱之為未決信號集。在屏蔽解除前,信號一直處于未決狀態。?? 因此阻塞信號集影響著未決信號集。
信號屏蔽字(阻塞信號集)和未決信號集本質就是一個寄存器,在64位操作系統中,它們都是64位的寄存器(字長64位),寄存器中每一位代表了每一個信號的狀態,1為真,0為假。例如在未決信號集中,0表示該位表示的信號未產生或者已經產生且遞達(此時0到1到0是瞬間發生的);而1表示已經產生但是未抵達,這是由阻塞信號集對其產生的影響。
信號的編號:可以使用kill –l命令查看當前系統可使用的信號有哪些。
不存在編號為0的信號。其中1-31號信號稱之為常規信號(也叫普通信號或標準信號),34-64稱之為實時信號,驅動編程與硬件相關(嵌入式開發用到)。名字上區別不大。而前32個名字各不相同。
總結:產生信號(5種,此時未決信號集中相應的序號對應立即變為1)? 阻塞? ?解除阻塞? ?遞達?? 處理:1.默認處理動作(5種)? 2.忽略處理? 3.捕捉
總結
- 上一篇: 成都欢乐谷老年人免费吗
- 下一篇: 信号四要素