第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

如何在 Go 中捕獲任意 UNIX 信號

如何在 Go 中捕獲任意 UNIX 信號

Go
守候你守候我 2022-06-13 15:51:29
我可以使用信號包捕獲信號,但是如何捕獲從 34(SIGRTMIN)到 64(SIGRTMAX)的信號(鏈接)?Golang 稱它們?yōu)椤靶盘?34”、“信號 64”等,但這已經(jīng)超出了重點。當我運行“pkill -34”時,我希望我的應用程序注意到它。當我捕獲所有信號時,我可以捕獲它們:sigChan := make(chan os.Signal, 1) signal.Notify(sigChan)但是我不想捕捉所有信號,我只想要我之前提到的那些。我也知道我可以捕獲單個信號,例如:signal.Notify(sigChan, os.Interrupt, syscall.SIGPOOL, syscall.SIGCLD ...)但這需要信號常數(shù),我找不到與我想要捕獲的信號相對應的常數(shù)。有任何想法嗎?
查看完整描述

2 回答

?
月關寶盒

TA貢獻1772條經(jīng)驗 獲得超5個贊

簡短的回答:


您可以將新信號聲明為 type 的類型化常量syscall.Signal:


const (

    SIGRTMIN = syscall.Signal(0x22)

)

長答案(它是如何工作的):


signal.Notify函數(shù)簽名是:


Notify(c chan<- os.Signal, sig ...os.Signal)

哪里os.Signal是這樣定義的接口:


// A Signal represents an operating system signal.

// The usual underlying implementation is operating system-dependent:

// on Unix it is syscall.Signal.

type Signal interface {

    String() string

    Signal() // to distinguish from other Stringers

}

通常你會使用signal.Notify你的例子中的函數(shù):


signal.Notify(sigChan, os.Interrupt, syscall.SIGPOOL, syscall.SIGCLD ...)

因此,如果我們檢查包中這些常量的實現(xiàn),syscall我們會看到:


SIGKILL   = Signal(0x9)

包中的 thisSignal是syscall定義的類型:


// A Signal is a number describing a process signal.

// It implements the os.Signal interface.

type Signal int


func (s Signal) Signal() {}


func (s Signal) String() string {

    // ... a few lines of code

}

它只是一個int帶有無操作Signal()方法和 Stringer 實現(xiàn)的底層。


int因此,您可以通過轉換任意值來為要捕獲的信號以相同的方式聲明自己的常量:


const (

    SIGRTMIN = syscall.Signal(0x22)

)


signal.Notify(sigChan, SIGRTMIN, /* etc. */)


查看完整回答
反對 回復 2022-06-13
?
白豬掌柜的

TA貢獻1893條經(jīng)驗 獲得超10個贊

- - - - - - - - - - - - - 回答 - - - - - - - - - - - - ---


由于 [blackgreen][3],此問題已得到解決。


我制作了一個小片段來輕松捕獲所有 SIGRT 信號:


package main


import (

    "fmt"

    "syscall"

    "os/signal"

    "os"

)


func getSIGRTchannel() chan os.Signal {

    sigChan := make(chan os.Signal, 1)

    sigArr := make([]os.Signal, 31)

    for i := range sigArr {

        sigArr[i] = syscall.Signal(i + 0x22)

    }

    signal.Notify(sigChan, sigArr...)

    return sigChan

}


func main() {

    c := getSIGRTchannel()

    // Block until a signal is received.

    for {

        s := <-c

        fmt.Println("Got signal:", s)

    }

}

要使用它,請在一個終端窗口中運行該程序并從另一個終端窗口向它發(fā)送一些信號。


查看完整回答
反對 回復 2022-06-13
  • 2 回答
  • 0 關注
  • 165 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網(wǎng)微信公眾號