当前位置: 首页 > 编程日记 > 正文

Linux守护进程实现

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


相关文章:

美团十年,支撑最大规模外卖配送的一站式机器学习平台如何炼成?

作者 | 艳伟&#xff0c;美团配送技术团队资深技术专家编辑 | 唐小引题图 | 东方 ICAI 是目前互联网行业炙手可热的“明星”&#xff0c;无论是老牌巨头&#xff0c;还是流量新贵&#xff0c;都在大力研发 AI 技术&#xff0c;为自家的业务赋能。配送作为外卖平台闭环链条上重要…

Windows 2008 R2中的NAP新功能详解

随着Windows Server 2008 R2版本的发布&#xff0c;Windows网络访问保护模式&#xff08;NAP&#xff09;又增加了新功能。在本文中&#xff0c;笔者将对新功能进行简要的介绍。Windows Server 2008中提供的网络访问保护(NAP)功能已经更新到R2版本。在Windows功能、无线网络访问…

whoosh学习(1)

2019独角兽企业重金招聘Python工程师标准>>> 背景 当前项目需要用到全文搜索redis不方便实现mysql效率太低搜索引擎选择 pylucenewhoosh&#xff08;似乎更受欢迎&#xff0c;文档最全&#xff09;为什么选择 纯python实现&#xff0c;省了编译二进制包的繁琐过程。…

仿照redis写的nginx开机画面

redis有一个开机画面&#xff1a; 下面是我写的的nginx开机画面&#xff1a; 新建一个文件 asciilogo.h //仿照redis风格打印一个logo,这样启动的时候就不会不注意 char *ascii_logo " …

房子成焦点,被挂马的房产网站仍在增加中

统计发现&#xff0c;近期大部分使用极光漏洞挂马&#xff0c;这个漏洞实在是太好用了。没打补丁&#xff0c;没装网盾&#xff0c;按网马广告上说的&#xff0c;有不弹、不卡、不闪三大“优点”&#xff0c;点击挂马网页会中招。今天新增被挂马的知名房产网站列表&#xff08;…

检测、量化、追踪新冠病毒,基于深度学习的自动CT图像分析有多靠谱?

作者 | Ophir Gozes, Maayan Frid-Adar等译者 | 刘畅出品 | AI科技大本营&#xff08;ID:rgznai100&#xff09;背景&#xff1a;新冠病毒的传播非常迅速&#xff0c;并对数十亿人的生活产生了重大影响。由于非对称胸部CT已被证明是检测、量化和追踪该疾病的有效工具&#xff0…

关于产品体验以及产品会被抄袭的思考

一个好产品本来可以以免费让用户注册为开始吸引用户并从而能引导用户进行消费和购买的&#xff1b;但是由于可能考虑到当前这个产品可能会被别人抄袭&#xff0c;从而设定了门槛&#xff0c;然后营销团队进行沟通&#xff0c;和别人说当前的产品是多么多么的好&#xff0c;从而…

Linux socket 网络编程 常用头文件

一 三种类型的套接字&#xff1a;1.流式套接字&#xff08;SOCKET_STREAM)提供面向连接的可靠的数据传输服务。数据被看作是字节流&#xff0c;无长度限制。例如FTP协议就采用这种。2.数据报式套接字&#xff08;SOCKET_DGRAM&#xff09;提供无连接的数据传输服务&#xff0c;…

达摩院实现自动驾驶核心技术突破,达摩院首次实现3D物体检测精度与速度的兼得

阿里巴巴达摩院在自动驾驶3D物体检测领域取得了新突破&#xff01;达摩院近期一篇论文入选计算机视觉顶会CVPR 2020&#xff0c;该论文提出了一个通用、高性能的自动驾驶检测器&#xff0c;首次实现3D物体检测精度与速度的兼得&#xff0c;有效提升自动驾驶系统安全性能。目前&…

$httpprovider指令中拦截器interceptors的使用介绍

2019独角兽企业重金招聘Python工程师标准>>> $http服务允许我们使用http请求和后台做通信&#xff0c;但是在每一次放松请求之前我们都希望能够捕捉这个请求并且进行操作&#xff0c;比如之前富瑞中每一个请求中header要放入用户名和密码一样&#xff0c;富瑞的做法…

bzero, memset ,setmem 区别

bzero 原型&#xff1a;extern void bzero(void *s, int n);用法&#xff1a;#include <string.h> 功能&#xff1a;置字节字符串s的前n个字节为零。 说明&#xff1a;bzero无返回值。 举例&#xff1a; // bzero.c #include <sysl…

了解这4个重点,带你探索未来将如何设计智能系统和机器人!

作者 | Himanshu Ragtah 译者 | 天道酬勤 责编 | 徐威龙 出品 | AI科技大本营&#xff08;ID:rgznai100&#xff09; 到目前为止&#xff0c;为智能系统设计零件需要从头开始构建零件。从2D草图到可以根据给定的成本、材料和最大重量限制制造的可行且坚固的零件。这通常需要几天…

静态路由和默认路由的配置实例

RTA的配置&#xff1a;interface FastEthernet0/0ip address 1.1.1.2 255.255.255.252duplex autospeed auto!interface FastEthernet0/1no ip addressduplex autospeed autoshutdown!interface FastEthernet1/0ip address 10.10.10.1 255.255.255.0duplex autospeed auto!inte…

Centos运行级别和开机过程

一、Linux运行级别1&#xff09;0&#xff1a;关机2&#xff09;1&#xff1a;单用户3&#xff09;2&#xff1a;多用户状态没有网络服务4&#xff09;3&#xff1a;多用户状态有网络服务5&#xff09;4&#xff1a;系统未使用保留给用户6&#xff09;5&#xff1a;图形界面7&a…

PHP FPM设置

php-fpm启动 拷贝启用文件 # cp -R ./sapi/fpm/php-fpm /etc/init.d/php-fpm 启动 # /etc/init.d/php-fpm 重启 # killall php-fpm # /etc/init.d/php-fpm ------------------------ 进程不够就会起新&#xff0c;新的不能超过pm.max_children&#xff1b; 但是新的也会变为…

MySQL的binarylog处理

繁忙中測試新到的服務器&#xff0c;調試優化app&#xff0c;再加上月底公司搬家&#xff0c;很多配置都要更改。早上不經意telnet改dns的時候發現MySQL日誌很大了。。。 奇怪&#xff0c;我設置過的都改過了。。後來發現這台是子公司帶過來的機器。。。。以前那幾台都沒寫過配…

IJCAI 2020灭霸式拒稿,AI审稿是否更公平?

来源 | 数据派 THU编辑 | 文婧出品 | AI科技大本营&#xff08;ID:rgznai100&#xff09;一、IJCAI 2020灭霸式拒稿引众怒随着AAAI 2020于2月7日作为2020年人工智能学界的第一个顶会在美国纽约开幕&#xff0c;人工智能相关领域的研究者们又要为新一年的顶会忙碌了。对于AI界的…

ASP.NET MVC 中将FormCollection与实体间转换方法

http://blog.csdn.net/lutinghuan/article/details/8449296 将Action动作中传递的FormCollection转变成对应的实体&#xff0c;可以使用Controller的TryUpdateModel()方法。 示例如下&#xff1a; [csharp] view plaincopy [HttpPost] public ActionResult Create(FormCollect…

增量学习不只有finetune,三星AI提增量式少样本目标检测算法 | CVPR 2020

作者 | VincentLee来源 | 晓飞的算法工程笔记该论文研究了非常有意义的增量式少样本目标检测场景iFSD(Incremental Few-Shot Detection)&#xff0c;场景设置如下&#xff1a;检测模型可以在包含充足样本的基础类别上进行训练训练好后&#xff0c;iFSD能够应用到真实世界中&…

修改Linux内核参数提高服务器并发能力

1.参数设置 查看相关的参数 sysctl -a|grep tcp_keepalive net.ipv4.tcp_keepalive_intvl 30 net.ipv4.tcp_keepalive_probes 2 net.ipv4.tcp_keepalive_time 160 设置相关的参数 sysctl -w net.ipv4.tcp_keepalive_time 7500 也可以直接打开 # vim/etc/sysctl.conf 加入ne…

GPS小车移动应用程序

//用于desktop部署private void btnInitializeObjects_Click(object sender, System.EventArgs e){Catalog Cat MapInfo.Engine.Session.Current.Catalog; //创建临时层TableInfoMemTable tblInfoTemp new TableInfoMemTable("Animation");Table tblTemp Cat.GetT…

iOS网络-NSURLSessionDataTask大文件离线断点下载

什么叫离线断点下载,就是用户下载中关闭程序重新打开可以继续下载 代码实现如下: #import "ViewController.h" interface ViewController ()<NSURLSessionDataDelegate> //输出流 property (nonatomic, strong) NSOutputStream *stream ; //Task对象 property …

fcntl使用

1、获取文件的flags&#xff0c;即open函数的第二个参数: flags fcntl(fd,F_GETFL,0); 2、设置文件的flags: fcntl(fd,F_SETFL,flags); 3、增加文件的某个flags&#xff0c;比如文件是阻塞的&#xff0c;想设置成非阻塞: flags fcntl(fd,F_GETFL,0)…

两次关于软考网络工程师的经历

考过两次软考网络工程师&#xff0c;第一次没怎么准备&#xff0c;稀里糊涂参加考试&#xff0c;下午差几分&#xff1b;第二次痛定思痛&#xff0c;好好的分析了下试题&#xff0c;上午61&#xff0c;下午49&#xff0c;下午只写了30分钟左右&#xff0c;因为觉得自己过的了了…

“不会数学,干啥都不行!”骨灰级程序员:你方向不对,努力也白费!

最近半年来&#xff0c;我们收到了很多留言&#xff0c;有很多都是相似的问题&#xff1a;1&#xff09;数学不好搞编程好难&#xff0c;因为数据结构、编程语句、算法&#xff0c;核心原理都是数学。而且光会基础数学远远不够&#xff0c;还需要概率论&#xff0c;微积分、优化…

重新安装nginx注意事项

记得清理/etc/nginx/sites-enabled/default转载于:https://www.cnblogs.com/xiangnan/p/5146775.html

2020年,5种将死的编程语言

来源 | 码农网 译者 | 小峰曾几何时&#xff0c;几乎每个人都在使用Perl语言编程。但是那些经常使用的人慢慢地发现&#xff0c;关于这个Perl语言似乎总是有点不对劲。至少我知道有这么个叫做“piecemeal”的编程语言&#xff0c;它的创造者似乎就只是将这个功能堆在另一个功能…

关于 ulimit -SHn 65535

使用ulimit -a 可以查看当前系统的所有限制值&#xff0c;使用ulimit -n 可以查看当前的最大打开文件数。 新装的linux默认只有1024&#xff0c;当作负载较大的服务器时&#xff0c;很容易遇到error: too many open files。因此&#xff0c;需要将其改大。 使用 ulimit -n 65…

Could not load file or assembly App_Licenses.dll的问题

今天在AspDotNetStorefront做定制化开发&#xff0c;编译的时候莫名其妙地报告Could not load file or assembly App_Licenses, Version0.0.0.0, Cultureneutral, ... (Exception from HRESULT: 0x80070057 (E_INVALIDARG))的错误&#xff0c;检查文件系统&#xff0c;发现文件…

Docker 用法总结之:管理工具 shipyard 的具体使用指南

Docker 的命令行就已经非常好用了&#xff0c;假设非要加上基于 Web 的管理界面的话也有一些选择&#xff0c;如 DockerUI (Angular.js), Dockland (Ruby), Shipyard (Python/Django) 等。只是眼下来看 Shipyard 项目要活跃一点&#xff0c;Shipyard 支持多 host&#xff0c;能…