go :"os/signal"源碼解析

最近在學習go語言,基本語法熟悉以後,想看一些開源項目,因而就找到了NSQ,在看NSQ源碼的時候,對signal進行了閱讀,一下內容僅供參考。

linux信號量知識點

clipboard.png

  • 圖中能夠看到信號來一共是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信號量的知識儲備不全,先獲取了linux信號量的知識以後才搞明白爲何這麼寫的。
  • 源碼這種事情,仍是能夠單獨拿出來,針對看不懂的地方進行調試,快速的瞭解。
相關文章
相關標籤/搜索