用golang启动一个daemon

  1. package main
  2.  
  3. import (
  4. "fmt"
  5. "log"
  6. "os"
  7. "runtime"
  8. "syscall"
  9. "time"
  10. )
  11.  
  12. func daemon(nochdir, noclose int) int {
  13. var ret, ret2 uintptr
  14. var err syscall.Errno
  15.  
  16. darwin := runtime.GOOS == "darwin"
  17.  
  18. // already a daemon
  19. if syscall.Getppid() == 1 {
  20. return 0
  21. }
  22.  
  23. // fork off the parent process
  24. ret, ret2, err = syscall.RawSyscall(syscall.SYS_FORK, 0, 0, 0)
  25. if err != 0 {
  26. return -1
  27. }
  28.  
  29. // failure
  30. if ret2 < 0 {
  31. os.Exit(-1)
  32. }
  33.  
  34. // handle exception for darwin
  35. if darwin && ret2 == 1 {
  36. ret = 0
  37. }
  38.  
  39. // if we got a good PID, then we call exit the parent process.
  40. if ret > 0 {
  41. os.Exit(0)
  42. }
  43.  
  44. /* Change the file mode mask */
  45. _ = syscall.Umask(0)
  46.  
  47. // create a new SID for the child process
  48. s_ret, s_errno := syscall.Setsid()
  49. if s_errno != nil {
  50. log.Printf("Error: syscall.Setsid errno: %d", s_errno)
  51. }
  52. if s_ret < 0 {
  53. return -1
  54. }
  55.  
  56. if nochdir == 0 {
  57. os.Chdir("/")
  58. }
  59.  
  60. if noclose == 0 {
  61. f, e := os.OpenFile("/dev/null", os.O_RDWR, 0)
  62. if e == nil {
  63. fd := f.Fd()
  64. syscall.Dup2(int(fd), int(os.Stdin.Fd()))
  65. syscall.Dup2(int(fd), int(os.Stdout.Fd()))
  66. syscall.Dup2(int(fd), int(os.Stderr.Fd()))
  67. }
  68. }
  69.  
  70. return 0
  71. }
  72.  
  73. func main() {
  74. daemon(0, 1)
  75. for {
  76. fmt.Println("hello")
  77. time.Sleep(1 * time.Second)
  78. }
  79.  
  80. }

用golang启动一个daemon的更多相关文章

  1. 【.net 深呼吸】启动一个进程并实时获取状态信息

    地球人和火星人都知道,Process类既可以获取正在运行的进程,也可以启动一个新的进程.在79.77%应用场合,我们只需要让目标进程顺利启动就完事了,至于它执行了啥,有没有出错,啥时候退出就不管了. ...

  2. gulp启动一个小型web服务器配置&browserify(require)

    var gulp = require('gulp'), connect = require('gulp-connect'), // 运行live reload服务器 browserify = requ ...

  3. 第七周——Linux内核如何装载和启动一个可执行程序

    万子惠 + 原创作品转载请注明出处 + <Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000 part1 实验 ...

  4. android技巧(一):如何方便知晓当前Activity?如何管理应用中的Activity?如何最佳的启动一个Activity?

    1.如何方便知晓当前Activity? 可以不看代码根据当前界面就知道界面所在Activity的写法: 建立BaseActivity,继承自Activity,在BaseActivity的OnCreat ...

  5. C# 只启动一个实例完全解决方案

    工作上经常会遇到"程序只能启动一个实例"这样的需求. 我想,这样的需求应该很普遍,所以没打算去动脑筋,去找谷歌问下就得了,用下来发现,不是这里不爽就是那里不行. 先说下我详细的几点 ...

  6. 20135202闫佳歆--week 7 Linux内核如何装载和启动一个可执行程序--实验及总结

    week 7 实验:Linux内核如何装载和启动一个可执行程序 1.环境搭建: rm menu -rf git clone https://github.com/megnning/menu.git c ...

  7. WinFrom 只启动一个exe,并且获得焦点

    只启动一个exe方法: using System; using System.Collections.Generic; using System.Runtime.InteropServices; us ...

  8. 启动一个线程是用run()还是start()?

    启动一个线程是用run()还是start()? 答:启动一个线程是调用start()方法,使线程所代表的虚拟处理机处于可运行状态,这意味着它可以由JVM调度并执行.这并不意味着线程就会立即运行.run ...

  9. 启动一个新的activity并携带数据,返回数据给上一个activity

    一.在启动一个新的activity的时候可以通过Intent携带数据,通过Intent.putExtra()方法通过键值对的形势装入数据.在新启动的activity中通过           getI ...

随机推荐

  1. jQuery layer[页面弹出框]

    常见接口如下: 方法名 描述 $.layer({}) 核心接口,参数是一个对象,对象属性参见上述列表.诸如layer.alert()之类的为$.layer()的包装方法. layer.v 获取版本号. ...

  2. [ASP.NET] Session的了解

    ASP.NET Session的使用当中我们会遇到很多的问题,那么这里我们来谈下经常出现的一些常用ASP.NET Session的理解: ASP.NET Session的七点认识之一 对于值类型的变量 ...

  3. 转: React系统的入门系统

    评注:React系统的入门系统. 转:  http://www.infoq.com/cn/search.action?queryString=%E6%B7%B1%E5%85%A5%E6%B5%85%E ...

  4. SharePoint 2010 "客户端不支持使用windows资源管理器打开此列表" 解决方法

    SharePoint 2010 在“库”--“库工具”,有一个“使用资源管理器打开”的按钮,点上去报“客户端不支持使用windows资源管理器打开此列表”.如图: 解决方案:在“开始”--“管理工具” ...

  5. IntelliJ IDEA 集成Tomcat后找不到HttpServlet问题(2015年06月13日)

    今天第一次用IntelliJ IDEA集成Tomcat做东西玩,在IntelliJ IDEA中配置好Tomcat之后,开始写Servlet,结果却找不到HttpServlet类,原因就是Intelli ...

  6. 【CSS3】---结构性伪类选择器—nth-child(n)+nth-last-child(n)

    结构性伪类选择器—nth-child(n) “:nth-child(n)”选择器用来定位某个父元素的一个或多个特定的子元素.其中“n”是其参数,而且可以是整数值(1,2,3,4),也可以是表达式(2n ...

  7. PHP动态函数

    header('Content-type:text/html;Charset=utf8'); function welcome(){ echo 'Welcome to you.'; } functio ...

  8. C# 线程锁Lock 死锁

    使用lock场景 多线程环境中,不使用lock锁,会形成竞争条件,导致错误. 使用lock 锁 可以保证当有线程操作某个共享资源时,其他线程必须等待直到当前线程完成操作. 即是多线程环境,如果一个线程 ...

  9. WPF视频教程系列笔记

    视频二:XAML基础 1.顶级元素 <Window></Window>,<Page></Page>,<Application></Ap ...

  10. 1 对WinMain的理解

    就像C语言的main是它的程序路口一样,windows的程序入口是WinMain,WinMain的定义可以查看winbase.h文件. Hello Windows(c语言中的Hello world!) ...