博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Golang 实现守护进程实例
阅读量:5088 次
发布时间:2019-06-13

本文共 1576 字,大约阅读时间需要 5 分钟。

package main

import (

  "fmt"
  "os"
  "os/signal"
  "runtime"
  "time"

  "log"

  "syscall"
)

func Agent(nochdir,noclose int) int {

  var ret1,ret2 uintptr
  var err syscall.Errno
  darwin := runtime.GOOS == "darwin"

  //already a daemon process

  if syscall.Getppid() == 1 {
    return 0
  }
  //fork off the parent process
  ret1,ret2,err = syscall.RawSyscall(syscall.SYS_FORK, 0, 0, 0)
  if err != 0 {
    return -1
  }

  //failure

  if ret2 < 0 {
    os.Exit(-1)
  }

  //hand exception for darwin

  if darwin && ret2 == 1 {
    ret1 = 0
  }

  //new process success, exit the parent process

  if ret1 > 0 {
    os.Exit(0)
  }

  //change the filem mode mask

  _ = syscall.Umask(0)

  //create the new SID for the child process

  s_ret,s_errno := syscall.Setsid()
  if s_errno != nil {
    log.Printf("Error: syscall.Setsid error:%d",s_errno)
  }

  if s_ret < 0 {

    return -1
  }

  //modify the process execute directory

  if nochdir == 0 {
    os.Chdir("/")
  }

  //redirect the IO stream

  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()))
    }
  }
  fmt.Println(os.Getpid())
  return 0
}

func main() {

  fmt.Println("Hello, World.\n")
  fmt.Println(os.Getpid())
  fmt.Println("this is a first go program!")
  Agent(0,1)
  for {
    fmt.Println("hello")
    fmt.Println(os.Getpid())
    time.Sleep(1 * time.Second)
  }
}

转载于:https://www.cnblogs.com/chmyee/p/9970692.html

你可能感兴趣的文章
开发安卓app配置
查看>>
Scala基础知识(二)
查看>>
Python:游戏:300行代码实现俄罗斯方块
查看>>
fedora22 无法联网的情况下rpm安装gcc5.1
查看>>
cocos2dx - 在MFC中使用cocos2dx
查看>>
网络通信协议之ICMP
查看>>
Oracle+Ado.Net(二)
查看>>
1048. Find Coins (25)
查看>>
1097. Deduplication on a Linked List (25)
查看>>
HIS系统结算后,没有更新单据状态为“已结算”
查看>>
java Comparator和Comparable(比较器)
查看>>
暗恋时最心酸的一刻
查看>>
myeclipse8.5安装axis2 1.3
查看>>
爪哇国新游记之二十六----迷宫寻路
查看>>
centos6.5安装supervisor
查看>>
R语言适配问题集锦
查看>>
map和string的使用方法
查看>>
PowerShell
查看>>
界面使用webview,并且webview里面有图片进行自动切换导致界面上滚动条卡顿。...
查看>>
从大公司做.NET 开发跳槽后来到小公司的做.NET移动端微信开发的个人感慨
查看>>