time.sleep在分叉后冻结程序(Go)

时间:2013-12-23 12:58:08

标签: 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之后没有写入任何内容(如果没有,它可以正常工作)。

这可能是什么原因?

操作系统:Debian Linux 7.2 x64 去版本:1.2

1 个答案:

答案 0 :(得分:1)

我似乎遇到了运行时的一般问题:https://code.google.com/p/go/issues/detail?id=6664

更新:

G ++ 1:https://github.com/sevlyar/go-daemon

SO - 1