如何在Go中编写异步儿童收割机?

时间:2014-06-11 01:18:44

标签: go signals zombie-process

我有一些像这样的代码:

cmd = exec.Command(command)
//...
cmd.Run()
func reapChild(cmd) {
    sigc := make(chan os.Signal, 1)
    signal.Notify(sigc, syscall.SIGCHLD)
    go func() {
        my_signal := <- sigc
        log.Infof("appstore: reapChildren: got a SIGCHLD signal")
        cmd.Wait()
        signal.Stop(sigc)
    }()
}

这是一个特定的衍生儿童的过程,但我正在寻找 更通用的东西。

有没有办法让PID关闭my_signal?我正在寻找一些东西 像pid_t wait(int * status) - golang提供了一个函数 称为Wait4,它采用特定的PID。

1 个答案:

答案 0 :(得分:2)

正如你所说,Go的系统调用包具有以下功能:

func Wait4(pid int, wstatus *WaitStatus, options int, rusage *Rusage) (wpid int, err error)

这似乎对你有用。来自the BSD man page for wait(2)(请记住,Go部分是在Mac上开发的!):

  

wait4()调用为程序提供了更通用的接口   需要等待某些需要资源的子进程   子进程累积的利用率统计数据   要求选择。 其他等待函数使用   wait4()

通过传递正确的参数,您可以使用Wait4实现所需的目标。例如,如果您不想等待特定的孩子:

  

如果pid为-1,则呼叫会等待任何子进程。

您可以在手册页中找到所需的其他信息。