1 回答
TA贡献1802条经验 获得超5个赞
这里有很多事情需要梳理。
首先,这是操作系统本身的作用。然后,一旦我们知道操作系统是什么以及它做了什么,程序就会做什么。
显然,操作系统的作用取决于操作系统。POSIX风格的操作系统有两种:普通和基于进程组的,或killpg
。这个函数的 killpg 变体是唯一一个向整个进程组发送信号的函数;plain 只是向单个进程发送信号。kill
kill
kill
kill
当程序从控制终端运行时,键盘信号(^C,^Z等)被发送到该控制终端的前台进程组(请参阅链接的页面以获取对这些信号的合理描述,并注意BSD / macOS也有^T和)。但是,如果信号是从其他程序发送的,而不是从控制终端发送的,则由该程序决定是否调用或 ,以及发送什么信号。SIGINFO
killpg
kill
某些信号无法捕获。SIGKILL和SIGSTOP就是这种情况。这些信号不应该随意发送;它们应该保留给最后的手段。相反,希望另一个程序停止的程序通常应该发送SIGINT,SIGTERM,SIGHUP或(很少)SIGQUIT中的一个。Go倾向于将SIGQUIT绑定到调试(因为POSIX系统上的运行时使^\转储各种goroutines的堆栈),因此这不是一个好的选择。但是,这不是由您在此处编写的Go程序决定的,该程序只能尝试捕获信号。发送内容的选择取决于发件人。
捕捉信号的“Go方式”是使用goroutine和通道。信号。通知
功能将操作系统级信号转换为通道上的事件。您不知道(也无法)知道的是信号是否通过或到达您的过程(尽管如果它来自控制终端交互,POSIX-y内核通过等效项发送)。如果要自行传播该信号,只需使用通知事件调用进行操作系统级调用的代码即可。使用 os/exec
包时,请使用 cmd.Process.Signal
:请注意,这会调用 POSIX ,而不是它的 ,但您不希望在此处使用,因为我们首先假设的是非进程组信号(基于 p 组的信号可能不需要传播)。kill
killpg
killpg
kill
kill
killpg
killpg
没有完全可移植的方式将信号发送到POSIX进程组(这并不奇怪,因为这不是可移植到非POSIX系统)。可悲的是,在Go中似乎没有直接的Unix或POSIX特定方法来做到这一点。
在非POSIX系统上,一切都完全不同。请参阅操作系统/信号
包前面的讨论。
- 1 回答
- 0 关注
- 129 浏览
添加回答
举报