c语言notify头文件,关于 signal.Notify 使用带缓存的 channel

```go

package main

import (

"fmt"

"os"

"os/signal"

)

func main() {

// Set up channel on which to send signal notifications.

// We must use a buffered channel or risk missing the signal

// if we're not ready to receive when the signal is sent.

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

signal.Notify(c, os.Interrupt)

// Block until a signal is received.

s :=

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

}

```

上面一段代码是 `signal.Notify` 的事例代码,注释说:

> 我们得使用带缓冲 channel

>

> 否则,发送信号时我们还没有准备好接收,就有丢失信号的风险

我一直没理解这段注释,于是翻看源码 `$GOROOT/src/os/signal/signal.go`,有这样一段代码,并注释有“发送但不阻塞”。这里应该就是“有可能丢失信号”的原因了吧。

```go

...

for c, h := range handlers.m {

if h.want(n) {

// send but do not block for it

select {

case c

default:

}

}

}

...

```

于是,我写了一段代码进行测试:

```go

package main

import (

"log"

"os"

"os/signal"

"time"

)

func main() {

c := make(chan os.Signal)

signal.Notify(c, os.Interrupt)

time.Sleep(time.Second * 5) // 假装 5 秒没准备好接收

s :=

log.Println(s)

}

```

在使用不带缓存的 channel 时,5 秒的 sleep 期间无论按多少个 control + c,sleep 结束都不会打印,也不会退出程序;

在使用带缓存的 channel 时,只要接收到一个 `SIGINT` ,在 sleep 结束后也就是准备好接收,便会打印并退出程序。

这就是 `signal.Notify` 使用带缓存 channel 的作用。

有疑问加站长微信联系(非本文作者))

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值