Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/go/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/unix/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Go内部如何处理操作系统信号通道?_Go_Unix_Signals - Fatal编程技术网

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