Golang 父进程退出时如何自动终止子进程
Golang 父进程退出,子进程为何不退出?
在 Golang 中,父进程退出时子进程并不会自动退出。这是因为 Go 将子进程视为独立的进程,即使由父进程创建,它们之间也没有直接的父子关系。
如何实现父进程退出时自动终止子进程?
要实现父进程退出时自动终止子进程,可以使用 os/exec 包中的 Command 对象启动子进程,并在父进程退出时调用 Command 对象的 Process.Kill() 方法强制终止子进程。
以下是一个示例代码:
package main
import (
'fmt'
'os'
'os/exec'
'syscall'
)
func main() {
cmd := exec.Command('sleep', '10')
err := cmd.Start()
if err != nil {
fmt.Println('Failed to start command:', err)
os.Exit(1)
}
// 在父进程退出时强制终止子进程
defer func() {
fmt.Println('Parent process is exiting...')
cmd.Process.Signal(syscall.SIGTERM) // 发送 SIGTERM 信号
cmd.Process.Wait() // 等待子进程退出
}()
fmt.Println('Parent process is running...')
os.Exit(0)
}
代码解释:
- 使用
exec.Command()创建一个Command对象来启动名为 'sleep' 的子进程。 - 调用
cmd.Start()启动子进程。 - 使用
defer关键字确保在父进程退出时执行终止子进程的操作。 - 调用
cmd.Process.Signal(syscall.SIGTERM)发送SIGTERM信号给子进程,请求其终止。 - 调用
cmd.Process.Wait()等待子进程退出,确保子进程资源得到释放。
通过以上方法,即可在 Golang 中实现父进程退出时自动终止子进程,保证程序的稳定性和资源的合理利用。
原文地址: https://www.cveoy.top/t/topic/jmwv 著作权归作者所有。请勿转载和采集!