1
我分叉成「守護程序」模式使用此功能後time.sleep凍結程序:分叉(圍棋)
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
之後沒有寫入任何內容(如果沒有的話,它工作正常)。
這可能是什麼原因?
操作系統:Linux的Debian的7.2 x64的 去版本:1.2
你在哪裏添加了「睡眠」? – janisz
@janisz:定期運行系統命令的循環(通過'exec.Command')。如果程序在前臺運行(即沒有調用上面定義的'daemon'),該循環就可以正常工作,包括'time.Sleep'。在bg中,在'time.Sleep'之後,沒有其他任何內容被寫入syslog或我自己打開的測試日誌中。 – LetMeSOThat4U
@janisz:此外,如果我註釋掉'time.Sleep',即使在bg中循環也會正確運行。 – LetMeSOThat4U