看起来如果您通过exec.Cmd和Start()创建一个子流程,Cmd.Process
则立即填充该字段,但是该Cmd.ProcessState
字段将保留nil
直到该流程退出。
// ProcessState contains information about an exited process, // available after a call to Wait or Run. ProcessState *os.ProcessState
因此,看起来我实际上无法Start()
在其仍在运行时检查自己编辑的进程的状态?
ProcessState
当进程退出时,设置对我来说没有意义。在这种情况下,将始终返回一个ProcessState.Exited()方法true
。
所以我尝试走这条路:cmd.Process.Pid
字段紧接在I之后cmd.Start()
,但是看起来像os.Process没有公开任何机制来检查进程是否在运行。
在Unix系统上,无论进程是否存在,FindProcess总是成功并返回给定pid的Process。
这没有用–似乎没有办法从os.Process转到os.ProcessState,除非您.Wait()
破坏了整个目的(我想知道该进程是否在退出之前在运行)。
我认为您在这里有两个合理的选择:
衍生出一个goroutine,等待进程退出。等待完成后,您知道该过程已退出。(正面:很容易正确编码;负面:将OS线程专用于等待。)
使用syscall.Wait4()
于已出版Pid
。Wait4
具有syscall.WNOHANG
set的A立即返回,填写状态。
如果有一个导出os
或cmd
函数Wait4
为您完成并填充了ProcessState,那可能会很好。您WNOHANG
认为合适,可以提供或不提供。但是没有。
的要点ProcessState.Exited()
是区分所有各种可能性,包括:
请参见ProcessState的纵梁。请注意,还有比这两个更多的可能性......只是似乎有没有办法让别人进一个ProcessState
。syscall.Wait
似乎唯一的电话是:
syscall/exec_unix.go
:失败后exec
,在返回错误之前收集僵尸;和os/exec_unix.go
:致电后p.blockUntilWaitable()
。如果不是的blockUntilWaitable
,则exec_unix.go
执行变异wait()
可致电syscall.Wait4
用syscall.WNOHANG
,但blockUntilWaitable
本身保证,这是没有意义的(这特别的目的wait
是等待退出反正)。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句