go :"os/signal"源碼解析

來源:互聯網
上載者:User
最近在學習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訊號量的知識之後才搞明白為什麼這麼寫的。
  • 源碼這種事情,還是可以單獨拿出來,針對看不懂的地方進行調試,快速的瞭解。
相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.