前端之家收集整理的这篇文章主要介绍了
golang 守护进程(daemon),
前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
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)
}
}
原文链接:https://www.f2er.com/go/190621.html