gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 22:35:20 24 4
gpt4 key购买 nike

我试图阻止程序打开另一个实例(如果已经打开),为此,我创建了一个扩展名为.lock的文件,并在退出程序时将其删除。但是,除remove之外的所有内容都可以。

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的系统上都可以工作。

最佳答案

我认为这是因为您的主要功能在启动goroutine之后很快就存在。如果main函数结束,则所有正在运行的goroutine也将死亡。

这是对我有用的代码:

package main

import (
"fmt"
"os"
"os/signal"
"sync"
)

func main() {

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
if lockstate {
var err = os.Remove("ms.lock")
if err != nil {
fmt.Println("Error removing file: ", err)
}
}
os.Exit(0)
}()

wg := &sync.WaitGroup{}
wg.Add(1)
wg.Wait()

}


我添加了waitgroup在主线程中等待。在MacOS上运行良好-创建 ms.lock文件并等待。使用Cmd + C杀死它会删除该文件。

只要信号触发,它就可以在任何地方工作。

关于go - 如何在golang中创建.lock文件并在退出前将其删除?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58263925/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com