英文:
time.sleep freezes the program after forking (Go)
问题
我正在使用以下函数将程序切换到“守护进程”模式:
func daemon(nochdir, noclose int) int {
ret, _, err := syscall.Syscall(syscall.SYS_FORK, 0, 0, 0)
if err != 0 {
maybe_exit_err("Forking", err)
return -1
}
switch ret {
case 0:
break
default:
os.Exit(0)
}
sid, err2 := syscall.Setsid()
maybe_exit_err(fmt.Sprintf("could not set session: %s", sid), err2)
if sid == -1 {
return -1
}
if nochdir == 0 {
os.Chdir("/")
}
if noclose == 0 {
f, e := os.OpenFile("/dev/null", os.O_RDWR, 0)
if e == nil {
fd := int(f.Fd())
syscall.Dup2(fd, int(os.Stdin.Fd()))
syscall.Dup2(fd, int(os.Stdout.Fd()))
syscall.Dup2(fd, int(os.Stderr.Fd()))
}
}
return 0
}
只要我不使用time.Sleep(1 * time.Second)
,程序就能正常工作。但是,一旦使用了time.Sleep
,程序就会停在那里什么都不做。我甚至在一个我自己打开的文件中添加了一个循环写入测试字符串的操作,但在使用time.Sleep
后(如果不使用则正常工作),文件中没有任何内容被写入。
这可能是什么原因呢?
操作系统:Debian Linux 7.2 x64
Go 版本:1.2
英文:
I am forking into "daemon" mode with this function:
func daemon(nochdir, noclose int) int {
ret, _, err := syscall.Syscall(syscall.SYS_FORK, 0, 0, 0)
if err != 0 {
maybe_exit_err("Forking", err)
return -1
}
switch ret {
case 0:
break
default:
os.Exit(0)
}
sid, err2 := syscall.Setsid()
maybe_exit_err(fmt.Sprintf("could not set session: %s", sid), err2)
if sid == -1 {
return -1
}
if nochdir == 0 {
os.Chdir("/")
}
if noclose == 0 {
f, e := os.OpenFile("/dev/null", os.O_RDWR, 0)
if e == nil {
fd := int(f.Fd())
syscall.Dup2(fd, int(os.Stdin.Fd()))
syscall.Dup2(fd, int(os.Stdout.Fd()))
syscall.Dup2(fd, int(os.Stderr.Fd()))
}
}
return 0
}
The program works fine as long as I do not use time.Sleep(1 * time.Second)
. After that, it just sits there doing nothing, I have even added writing test string in a loop to a file I opened myself, and nothing is being written there after time.Sleep
is used (and it works fine if not).
What might be the reason here?
OS: Debian Linux 7.2 x64
go version: 1.2
答案1
得分: 1
看起来我遇到了一个与运行时相关的一般问题:https://code.google.com/p/go/issues/detail?id=6664
更新:
G++1:https://github.com/sevlyar/go-daemon
SO--1
英文:
It seems I've ran into general issue with runtime: https://code.google.com/p/go/issues/detail?id=6664
UPDATE:
G++1 : https://github.com/sevlyar/go-daemon
SO--1
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论