golang daemon
发布时间:2020-12-16 18:47:01 所属栏目:大数据 来源:网络整理
导读:package main import ( "fmt" "log" "os" "runtime" "syscall" "time") func daemon(nochdir,noclose int) int { var ret,ret2 uintptr var err syscall.Errno darwin := runtime.GOOS == "darwin" // already a daemon if syscall.Getppid() == 1 { return
package main import ( "fmt" "log" "os" "runtime" "syscall" "time" ) func daemon(nochdir,noclose int) int { var ret,ret2 uintptr var err syscall.Errno darwin := runtime.GOOS == "darwin" // already a daemon if syscall.Getppid() == 1 { return 0 } // fork off the parent process ret,ret2,err = syscall.RawSyscall(syscall.SYS_FORK,0) if err != 0 { return -1 } // failure if ret2 < 0 { os.Exit(-1) } // handle exception for darwin if darwin && ret2 == 1 { ret = 0 } // if we got a good PID,then we call exit the parent process. if ret > 0 { os.Exit(0) } /* Change the file mode mask */ _ = syscall.Umask(0) // create a new SID for the child process s_ret,s_errno := syscall.Setsid() if s_errno != nil { log.Printf("Error: syscall.Setsid errno: %d",s_errno) } if s_ret < 0 { return -1 } if nochdir == 0 { os.Chdir("/") } if noclose == 0 { f,e := os.OpenFile("/dev/null",os.O_RDWR,0) if e == nil { fd := f.Fd() syscall.Dup2(int(fd),int(os.Stdin.Fd())) syscall.Dup2(int(fd),int(os.Stdout.Fd())) syscall.Dup2(int(fd),int(os.Stderr.Fd())) } } return 0 } func main() { daemon(0,1) for { fmt.Println("hello") time.Sleep(1 * time.Second) } } (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |