2013-12-23 85 views
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

+0

你在哪裏添加了「睡眠」? – janisz

+0

@janisz:定期運行系統命令的循環(通過'exec.Command')。如果程序在前臺運行(即沒有調用上面定義的'daemon'),該循環就可以正常工作,包括'time.Sleep'。在bg中,在'time.Sleep'之後,沒有其他任何內容被寫入syslog或我自己打開的測試日誌中。 – LetMeSOThat4U

+0

@janisz:此外,如果我註釋掉'time.Sleep',即使在bg中循環也會正確運行。 – LetMeSOThat4U

回答