为了账号安全,请及时绑定邮箱和手机立即绑定

操作系统。Wait() 不等待 golang 中的程序终止

操作系统。Wait() 不等待 golang 中的程序终止

Go
慕姐8265434 2022-08-24 11:27:41
在我的代码执行过程中的某个时候,我希望我的程序启动一个编辑器(不管是哪一个)供用户执行一些实时编辑。我需要我的程序在这一点上停止,直到用户决定关闭编辑器(或多或少git rebase的工作方式)以下是我的工作方式func main() {    fpath := os.TempDir() + "/afile.txt"    f, err := os.Create(fpath)    if err != nil {        log.Fatal(err)    }    defer f.Close()    cmd := exec.Command("/usr/local/bin/code", fpath)    err = cmd.Start()    if err != nil {        log.Fatal(err)    }    err = cmd.Wait()    if err != nil {        fmt.Println(err)    }}不会打印任何错误,但是上面的代码,尽管它当然会打开 ,但它在用户关闭编辑器之前终止(返回)。vscode不应该处理这个问题吗?cmd.Wait()该程序在MacOS Catalina fwiw上执行。
查看完整描述

2 回答

?
catspeake

TA贡献1111条经验 获得超0个赞

cmd.Wait() 不应该处理这个问题吗?

是的,确实如此。按预期等待,这是您的调用不正确,并且不会等待。的默认行为是在生成 VSCode 窗口后立即退出。它不会等待窗口关闭,因此 Go 不能等待窗口关闭。/usr/local/bin/codecode

尝试简单地在终端中输入。你会发现它会立即退出,甚至认为你的 VSCode 窗口仍处于打开状态。code

要在编辑器窗口关闭之前创建块(从而允许 Go 等待),您需要将 or 标志传递给它。再次尝试在终端中。在 VSCode 窗口关闭之前,你将找到终端命令块。code-w--waitcode -w

实际上,您只需要更改此设置...

    cmd := exec.Command("/usr/local/bin/code", fpath)

对此:

    cmd := exec.Command("/usr/local/bin/code", "-w", fpath)
        // or
    // cmd := exec.Command("/usr/local/bin/code", "--wait", fpath)


查看完整回答
反对 回复 2022-08-24
?
杨__羊羊

TA贡献1943条经验 获得超7个赞

根据 https://golang.org/pkg/os/exec/#Cmd.Start

“启动”将启动指定的命令,但不等待该命令完成。

如果 Start 成功返回,则将设置 c.Process 字段。

Wait 方法将返回退出代码,并在命令退出后释放关联的资源。

如果可以的话,你可以在底部找到,在linux中。strace code+++ exited with 0 +++

基本上,启动 vscode 的命令会退出(一种分叉),因此不会等待返回。clones

strace code -w实际上等待 vscode 退出。


查看完整回答
反对 回复 2022-08-24
  • 2 回答
  • 0 关注
  • 104 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信