如何在 golang 中创建一个 .lock 文件并在退出前将其删除?
How to create a .lock file in golang and remove it before exiting?
我试图阻止程序打开另一个已经打开的实例,为此我创建了一个扩展名为 .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
退出,按window右上角的关闭按钮退出,但一直没有发出信号,os.Interrupt
信号是从未被抓到。这是什么原因?
另外,我需要信号是非平台特定的,所以它应该在 windows 和基于 unix 的系统上都可以工作。
我想是因为你的main函数在启动goroutine后很快就存在了。如果 main 函数结束,所有 运行 个 goroutines 也会死亡。
这是适合我的代码:
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()
}
我添加了等待组在主线程中等待。在 MacOS 上工作正常 - 创建 ms.lock
文件并等待。用 Cmd + C 杀死它会删除文件。
只要信号触发,应该可以在任何地方工作。
我试图阻止程序打开另一个已经打开的实例,为此我创建了一个扩展名为 .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
退出,按window右上角的关闭按钮退出,但一直没有发出信号,os.Interrupt
信号是从未被抓到。这是什么原因?
另外,我需要信号是非平台特定的,所以它应该在 windows 和基于 unix 的系统上都可以工作。
我想是因为你的main函数在启动goroutine后很快就存在了。如果 main 函数结束,所有 运行 个 goroutines 也会死亡。
这是适合我的代码:
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()
}
我添加了等待组在主线程中等待。在 MacOS 上工作正常 - 创建 ms.lock
文件并等待。用 Cmd + C 杀死它会删除文件。
只要信号触发,应该可以在任何地方工作。