最近在學習go語言,基本文法熟悉之後,想看一些開源項目,於是就找到了NSQ,在看NSQ源碼的時候,對signal進行了閱讀,一下內容僅供參考。
linux訊號量知識點
- 圖中可以看到訊號來一共是62個,32和33沒有
- 非即時訊號都不支援排隊,都是不可靠訊號;即時訊號都支援排隊,都是可靠訊號。
- 1到31號都是不可靠訊號
go 語言singnal的源碼(部分)
type handler struct { mask [(numSig + 31) / 32]uint32 } func (h *handler) want(sig int) bool { return (h.mask[sig/32]>>uint(sig&31))&1 != 0 } func (h *handler) set(sig int) { h.mask[sig/32] |= 1 << uint(sig&31) } func (h *handler) clear(sig int) { h.mask[sig/32] &^= 1 << uint(sig&31) }
- type handler struct :定義了處理訊號量的資料結構,mask [(numSig + 31) / 32]uint32中numSig是65,所以就是一個2個元素的數組,元素類型是uint32位的,4位元組
- set函數中,mask數組的初始化都是0,uint(sig&31)是整數截取後5位,左移一位是因為訊號量是從1開始的。因此運算完之後,前31個訊號量存放在mask數組的第一個元素中,這個4位元組的元素可以表示成32位的二進位,0000,0000,0000,0000,0000,0000,0000,0000,從後往前,編號從0到31,如果訊號量是1,則編號為1的位置置1。就像是有32個桶,每個桶都有一個編號,從0到31,如果有這個訊號量的值,就在桶裡放滿水。
- want函數是判斷給定的整數,是不是這個62個訊號量。
- clear 利用&^,將對應位置清零
go語言這種處理方式閱讀起來還是挺巧妙的,之前看得時候也是弄明白,現在記下來,希望能提供一點用處。
總結
- linux訊號量的知識儲備不全,先擷取了linux訊號量的知識之後才搞明白為什麼這麼寫的。
- 源碼這種事情,還是可以單獨拿出來,針對看不懂的地方進行調試,快速的瞭解。