猿问

如何在golang中创建.lock文件并在退出前将其删除?

我试图阻止程序打开另一个已打开的实例,为此,我创建一个带有.lock扩展名的文件,并在退出程序时将其删除。然而,除了删除之外,一切都有效。


package main


import (

    "os"

    "os/signal"

    "fmt"

)


func main() {

    var test string

    exitsig := make(chan os.Signal, 1)

    signal.Notify(exitsig, os.Interrupt)

    var (

        lockstate bool = false

    )


    if _, err := os.Stat("ms.lock"); err == nil {

      return


    } else if os.IsNotExist(err) {

      var file, err = os.Create("ms.lock")

        if err != nil {

            return

        }

        file.Close()

        lockstate = true

    }


    go func() {

      <- exitsig

        fmt.Println("Error removing file")

        fmt.Scanf("%s", &test)

        if lockstate {

            var err = os.Remove("ms.lock")

            if err != nil {

                fmt.Println("Error removing file")

                fmt.Scanf("%s", &test)

            }

        }

      os.Exit(0)

    }()


}

我尝试过通过ctrl+c按窗口右上角的关闭按钮退出,但它从未发送信号,信号os.Interrupt从未被捕获。这是什么原因呢?


另外,我需要信号是非特定于平台的,因此它应该适用于基于 Windows 和 UNIX 的系统。


白衣染霜花
浏览 109回答 1
1回答

智慧大石

我认为这是因为你的 main 函数在启动 goroutine 后不久就存在了。如果 main 函数结束,所有正在运行的 goroutine 也会死亡。这是适合我的代码:package mainimport (&nbsp; &nbsp; "fmt"&nbsp; &nbsp; "os"&nbsp; &nbsp; "os/signal"&nbsp; &nbsp; "sync")func main() {&nbsp; &nbsp; exitsig := make(chan os.Signal, 1)&nbsp; &nbsp; signal.Notify(exitsig, os.Interrupt)&nbsp; &nbsp; var (&nbsp; &nbsp; &nbsp; &nbsp; lockstate bool = false&nbsp; &nbsp; )&nbsp; &nbsp; if _, err := os.Stat("ms.lock"); err == nil {&nbsp; &nbsp; &nbsp; &nbsp; return&nbsp; &nbsp; } else if os.IsNotExist(err) {&nbsp; &nbsp; &nbsp; &nbsp; var file, err = os.Create("ms.lock")&nbsp; &nbsp; &nbsp; &nbsp; if err != nil {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; return&nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; &nbsp; &nbsp; file.Close()&nbsp; &nbsp; &nbsp; &nbsp; lockstate = true&nbsp; &nbsp; }&nbsp; &nbsp; go func() {&nbsp; &nbsp; &nbsp; &nbsp; <-exitsig&nbsp; &nbsp; &nbsp; &nbsp; if lockstate {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; var err = os.Remove("ms.lock")&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; if err != nil {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; fmt.Println("Error removing file: ", err)&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; &nbsp; &nbsp; os.Exit(0)&nbsp; &nbsp; }()&nbsp; &nbsp; wg := &sync.WaitGroup{}&nbsp; &nbsp; wg.Add(1)&nbsp; &nbsp; wg.Wait()}我添加了等待组以在主线程中等待。在 MacOS 上运行良好 - 创建ms.lock文件并等待。使用 Cmd + C 杀死它会删除该文件。只要信号响起,就可以在任何地方工作。
随时随地看视频慕课网APP

相关分类

Go
我要回答