Go内部如何处理操作系统信号通道?
拥有代码时:Go内部如何处理操作系统信号通道?,go,unix,signals,Go,Unix,Signals,拥有代码时: 主程序包 进口( “操作系统” “操作系统/信号” ) func main(){ 信号:=接通(切换操作信号,1) 信号通知(sig) 您遇到死锁,因为您尝试从通道接收消息,但不存在其他正在运行且没有发送方的goroutine。同时调用signal.Notify在后台启动watchSignalLoop()goroutine,您可以在此处验证实现详细信息 通道不关心元素类型,除非您的元素类型大于64kB(严格来说,还有其他细微差别,请检查实现) 不要猜测运行时是如何工作的,对它进行研
主程序包
进口(
“操作系统”
“操作系统/信号”
)
func main(){
信号:=接通(切换操作信号,1)
信号通知(sig)
您遇到死锁,因为您尝试从通道接收消息,但不存在其他正在运行且没有发送方的goroutine。同时调用signal.Notify
在后台启动watchSignalLoop()
goroutine,您可以在此处验证实现详细信息
通道不关心元素类型,除非您的元素类型大于64kB(严格来说,还有其他细微差别,请检查实现)
不要猜测运行时是如何工作的,对它进行研究。例如,你可以检查当你调用make(chanint)时会发生什么
。您可以执行go工具编译-S main.go | grep main.go:make chan行
,并检查从运行时包调用的函数。然后跳转到此文件并投入时间了解实现。您将看到,与其他内容相比,通道的实现非常简单明了
希望有帮助!实际的信号处理是操作系统特有的,并在运行时实现。但是,通道的处理与任何其他通道都没有区别。调用Notify会启动一个goroutine,该goroutine最终会在通道上发送一个OS.signal值。请尝试第一个不带signal.Notify(sig)
的程序。“频道不关心元素类型,除非你的元素类型小于64kB”你有这个说法的来源吗?实际上几乎所有的元素类型都小于64kB。@彼得,这就是我的想法。如果类型大于64k,而不是小于64k,那就有区别了。我冒昧地更正了答案。
fatal error: all goroutines are asleep - deadlock!
goroutine 1 [chan receive]:
main.main()
/home/user/project/src/main.go:5 +0x4d
exit status 2