场景:
程序依赖另外一个程序,并开放个端口。遂启动时先 process:=exec.Command() process.Start().
问题来了,每次 ctrl+c 退出时,这个子进程就孤儿了。
所以想:
监听个 SIGINT 信号,信号来时直接 p.Kill()。测试,好使。
然后就封装了一下。
#伪代码
#proj/intenal/process/process.go
func(p *process) Go() {
p.cmd.Start()
chan ...signal
os.Notify....
go func <-chan; p.cmd.Kill()
}
新问题:ctrl+c 后。子进程退出了,主进程还活着。
不想 在项目里显式的 exec.Command(....一堆。
既然连 exec.Command 都没有了。也就不想在最外层监听信号再传到自己封的 process 里。
那么问题来了:怎么能在内部包的里面使用信号还不影响信号本身对程序的影响呢?
其实就是想:
#main
func main() {
internal.process.New().Go() # 一行,没有信号,没有需要关注的 ctx
http.ServerStart()
https.ServerStart()
rpc.ServerStart()
# 整个 main 就几行就行了。
}
这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。
V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。
V2EX is a community of developers, designers and creative people.