Linux守护进程

redis版:

void daemonize(void) {int fd;if (fork() != 0) exit(0); /* parent exits */setsid(); /* create a new session *//* Every output goes to /dev/null. If Redis is daemonized but* the 'logfile' is set to 'stdout' in the configuration file* it will not log at all. */if ((fd = open("/dev/null", O_RDWR, 0)) != -1) {dup2(fd, STDIN_FILENO);dup2(fd, STDOUT_FILENO);dup2(fd, STDERR_FILENO);if (fd > STDERR_FILENO) close(fd);}
}

memcached版:

int daemonize(int nochdir, int noclose)
{int fd;switch (fork()) {case -1:return (-1);case 0:break;default:_exit(EXIT_SUCCESS);}if (setsid() == -1)return (-1);if (nochdir == 0) {if(chdir("/") != 0) {perror("chdir");return (-1);}}if (noclose == 0 && (fd = open("/dev/null", O_RDWR, 0)) != -1) {if(dup2(fd, STDIN_FILENO) < 0) {perror("dup2 stdin");return (-1);}if(dup2(fd, STDOUT_FILENO) < 0) {perror("dup2 stdout");return (-1);}if(dup2(fd, STDERR_FILENO) < 0) {perror("dup2 stderr");return (-1);}if (fd > STDERR_FILENO) {if(close(fd) < 0) {perror("close");return (-1);}}}return (0);
}

lighttpd版:

#ifdef HAVE_FORK
static void daemonize(void) {
#ifdef SIGTTOUsignal(SIGTTOU, SIG_IGN);
#endif
#ifdef SIGTTINsignal(SIGTTIN, SIG_IGN);
#endif
#ifdef SIGTSTPsignal(SIGTSTP, SIG_IGN);
#endifif (0 != fork()) exit(0);if (-1 == setsid()) exit(0);signal(SIGHUP, SIG_IGN);if (0 != fork()) exit(0);if (0 != chdir("/")) exit(0);
}
#endif

nginx版:

ngx_int_t
ngx_daemon(ngx_log_t *log)
{int  fd;switch (fork()) {case -1:ngx_log_error(NGX_LOG_EMERG, log, ngx_errno, "fork() failed");return NGX_ERROR;case 0:break;default:exit(0);}ngx_pid = ngx_getpid();if (setsid() == -1) {ngx_log_error(NGX_LOG_EMERG, log, ngx_errno, "setsid() failed");return NGX_ERROR;}umask(0);fd = open("/dev/null", O_RDWR);if (fd == -1) {ngx_log_error(NGX_LOG_EMERG, log, ngx_errno,"open(\"/dev/null\") failed");return NGX_ERROR;}if (dup2(fd, STDIN_FILENO) == -1) {ngx_log_error(NGX_LOG_EMERG, log, ngx_errno, "dup2(STDIN) failed");return NGX_ERROR;}if (dup2(fd, STDOUT_FILENO) == -1) {ngx_log_error(NGX_LOG_EMERG, log, ngx_errno, "dup2(STDOUT) failed");return NGX_ERROR;}#if 0if (dup2(fd, STDERR_FILENO) == -1) {ngx_log_error(NGX_LOG_EMERG, log, ngx_errno, "dup2(STDERR) failed");return NGX_ERROR;}
#endifif (fd > STDERR_FILENO) {if (close(fd) == -1) {ngx_log_error(NGX_LOG_EMERG, log, ngx_errno, "close() failed");return NGX_ERROR;}}return NGX_OK;
}

注释版:

#include <stdio.h>
#include <fcntl.h>
#include <unistd.h>
#include <stdlib.h>int daemonize(void)
{int fd;switch(fork()) {case -1:return (-1);case 0:break;default://将父进程结束,让子进程变成真正的孤儿进程,并被init进程接管exit(0);}//子进程成为新的会话组长和新的进程组长,并与原来的登录会话和进程组脱离setsid();if ((fd = open("daemon.log", O_CREAT|O_RDWR|O_APPEND, 0)) != -1) {//dup2(int oldhandle, int newhandle)复制文件句柄dup2(fd, STDIN_FILENO);dup2(fd, STDOUT_FILENO);dup2(fd, STDERR_FILENO);//0,1和2文件句柄分别与标准输入,标准输出,标准错误输出相关联//所以用户应用程序调用open函数打开文件时,默认都是以3索引为开始句柄//fd已经由新的句柄代替,关闭fd句柄if (fd > STDERR_FILENO) (void)close(fd);}return 0;
}int main(int argc, char *argv[])
{daemonize();printf("%s\n","hello");return 0;
}

# cc daemonize.c -o daemonize

# ./daemonize

# ps aux | grep daemonize


参考:

http://blog.linuxphp.org/archives/1476/

http://www.cnblogs.com/xuxm2007/archive/2011/07/29/2121280.html

http://blog.csdn.net/yyyzlf/article/details/5267954

http://docs.linuxtone.org/ebooks/C&CPP/c/ch34s03.html

Linux守护进程实现相关推荐

  1. Linux 命令详解(六)Linux 守护进程的启动方法

    Linux 守护进程的启动方法 http://www.ruanyifeng.com/blog/2016/02/linux-daemon.html

  2. .NET跨平台实践:.NetCore、.Net5/6 Linux守护进程设计

    几年前,我写过两篇关于用C#开发Linux守护进程的技术文章,分别是<.NET跨平台实践:用C#开发Linux守护进程.NET跨平台实践:再谈用C#开发Linux守护进程 - 完整篇 这就是本文 ...

  3. .NET跨平台实践:再谈用C#开发Linux守护进程 — 完整篇

    Linux守护进程是Linux的后台服务进程,相当于Windows服务,对于为Linux开发服务程序的朋友来说,Linux守护进程相关技术是必不可少的,因为这个技术不仅仅是为了开发守护进程,还可以拓展 ...

  4. .NET跨平台实践:用C#开发Linux守护进程

    Linux守护进程(Daemon)是Linux的后台服务进程,它脱离了与控制终端的关联,直接由Linux init进程管理其生命周期,即使你关闭了控制台,daemon也能在后台正常工作. 一句话,为L ...

  5. 深入理解Linux守护进程

    深入理解Linux守护进程Linux服务器在启动时需要启动很多系统服务,它们向本地和网络用户提供了Linux的系统功能接口,直接面向应用程序和用户.提供这些服务的程序是由运行在后台的守护进程(daem ...

  6. Linux守护进程的创建(结合nginx框架)

    Linux守护进程的创建(结合nginx框架) 先介绍几个相关函数: int dup2(arg1,arg2):参数一指向的内容赋给参数二,shi的参数二也能访问参数一所指向的内容,并返回新的描述符 i ...

  7. linux+守护进程+php,【转载】Linux 守护进程的编程方法

    [转载]Linux 守护进程的编程方法 原文见: http://www.linuxdevelop.org/tingxx/show.php?table=c&id=3 Linux 守护进程的编程方 ...

  8. linux 守护进程_网络工程师之linux守护进程

    Linux守护进程就是通常所说的DEAMON进程,linux后台服务多种多样,每一个服务都运行一个对应的程序,这些后台程序对应的进程就是守护进程.系统中可以看到很多如DHCPD和HTTPD之类的进程, ...

  9. 【Linux】Linux 守护进程的启动方法

    转载:Linux 守护进程的启动方法 "守护进程"(daemon)就是一直在后台运行的进程(daemon). 本文介绍如何将一个 Web 应用,启动为守护进程. 一.问题的由来 W ...

最新文章

  1. 对一个伪装成微信的加固病毒的分析
  2. 从Linux系统内存逐步认识Android应用内存
  3. python @的用法
  4. 2020全国高中清华北大录取人数榜,各位学生快看!
  5. 解决AttributeError: 'module' object has no attribute 'main' 安装第三方包报错
  6. oracle cpu 利用率过高 kswapd0_服务器带宽监测与利用率过高的解决办法
  7. ITK:从函数返回对象
  8. 两个服务之间的调用请求
  9. C语言内存/指针相关
  10. 为什么写公众号,为什么改名字
  11. Intellij IDEA+Tomcat+JRebel热部署
  12. Samba的配置与使用
  13. IE安全防护方面强于Firefox和Chrome
  14. MacOS罗技鼠标定义的功能键经常失灵
  15. 『杭电1206』劲乐团
  16. 电脑win7蓝屏没有修复计算机,手把手教你win7蓝屏如何修复
  17. 软件项目管理经验总结
  18. 解决网上有重名的问题
  19. 通过一个具体的例子,讲解 SAP BDC 技术的使用步骤
  20. anaconda下安装pytorch超详细步骤(有问题可以在评论区提问会及时解答)

热门文章

  1. 程序员在职场中想快速升职,这4种潜质少不得!
  2. Java IDEA import sun.reflect.ConstructorAccessor报错
  3. PyTorch框架:(1)基本处理操作
  4. 力扣(LeetCode)刷题,简单题(第11期)
  5. keras 的 example 文件 antirectifier.py 解析
  6. 【机器视觉案例】(5) AI视觉,远程手势控制虚拟计算器,附python完整代码
  7. 211大学计算机系分数,这四所211大学,分数线超过不少985,分数低的还真不敢轻易报考...
  8. 基于VTK的Delaunay的三角剖分算法
  9. 在Ubuntu 16.04.1 LTS上测试Linux AIO功能实录
  10. active set + serving cell