为了账号安全,请及时绑定邮箱和手机立即绑定

Go 内部如何处理 os.Signal 通道?

Go 内部如何处理 os.Signal 通道?

Go
慕哥6287543 2022-06-13 10:24:45
有代码时:package mainimport (    "os"    "os/signal")func main() {    sig := make(chan os.Signal, 1)    signal.Notify(sig)    <-sig}运行没有问题,当然,阻塞直到你发送一个中断程序的信号。但:package mainfunc main() {    sig := make(chan int, 1)    <-sig}抛出此错误:fatal error: all goroutines are asleep - deadlock!goroutine 1 [chan receive]:main.main()    /home/user/project/src/main.go:5 +0x4dexit status 2虽然我理解为什么从int通道读取会导致死锁,但我只是怀疑它os.Signal不会,因为它的通道可能会遭受来自“外部”的写入,因为它处理信号并且它们来自程序外部。我的怀疑有点正确吗?如果是这样,运行时如何处理与其他通道类型不同的情况?谢谢!
查看完整描述

1 回答

?
湖上湖

TA贡献2003条经验 获得超2个赞

您遇到了死锁,因为尝试从通道接收消息,但没有其他运行的没有发送者的 goroutine 存在。同时调用在后台signal.Notify启动watchSignalLoop()goroutine,您可以在此处验证实现细节https://golang.org/src/os/signal/signal.go

频道不关心元素类型,除非你的元素类型大于 64kB(严格来说,还有其他细微差别,请检查实现)。

不要猜测运行时是如何工作的,对其进行研究。例如,您可以检查调用make(chan int). 您可以go tool compile -S main.go | grep main.go:line of make chan检查从运行时包中调用了哪个函数。然后只需跳转到该文件并花时间了解实现。您会看到与其他事物相比,通道的实现非常简单明了

希望能帮助到你!


查看完整回答
反对 回复 2022-06-13
  • 1 回答
  • 0 关注
  • 170 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号