在执行public void onClick(View view) {
Intent i = new Intent(this, Main2Activity.class);
startActivity(i);
}
时,我发现在命令启动os.Process.Kill之前调用cmd.Start(),我找到了可靠的解决方案,一个使用{{3} }}:
go test -race
或使用channel:
package main
import "os/exec"
func main() {
cmd := exec.Command("sleep", "10")
started := make(chan struct{}, 1)
go func() {
<-started
cmd.Process.Kill()
}()
if err := cmd.Start(); err != nil {
panic(err)
}
started <- struct{}{}
cmd.Wait()
}
这两个选项都有效但想知道什么是最惯用或更好的方法,而主要目标只是为了防止杀死一个尚未开始的过程。
答案 0 :(得分:0)
我建议你使用频道,但是让我指出你的代码。
我注意到你使用了缓冲通道,然后在调用消耗通道的goroutine之前首先在该通道上发送数据。在我看来,最好是:
1)使用无缓冲信道进行信令,特别是在这种情况下。
2)让goroutine负责启动进程并调用wait,同时向主要信号通知它已启动。
像这样:
package main
import "os/exec"
func main() {
cmd := exec.Command("sleep", "10")
started := make(chan struct{})
go func(cmd *exec.Cmd, signal chan struct{}) {
if err := cmd.Start(); err != nil {
panic(err)
}
started <- struct{}{}
cmd.Wait()
}(cmd, started)
<-started
cmd.Process.Kill()
}