twemproxy源码分析2——守护进程的创建
twemproxy源码中关于守护进程的创建实现得比较标准,先贴出代码来,然后结合一些资料来分析和列举一些实现守护进程的常用方法,不过不得不说twemproxy的实现确实是不错的,注释都写在了代码中,直接上代码吧:
static rstatus_t
nc_daemonize(int dump_core)
{
rstatus_t status;
pid_t pid, sid;
int fd; /*
* 先fork出一个子进程,把主进程关闭了
*/
pid = fork();
switch (pid) {
case -:
log_error("fork() failed: %s", strerror(errno));
return NC_ERROR; case :
break; default:
/* parent terminates */
_exit();
} /* 1st child continues and becomes the session leader */
/*
* 新fork出的子进程不可能是一个进程组的组长,这就避免了setsid函数调用的失败
* 在调用了setsid函数后该进程就成为新的会话组长和新的进程组长
* 并与原来的登录会话、进程组、控制终端脱离
*/
sid = setsid();
if (sid < ) {
log_error("setsid() failed: %s", strerror(errno));
return NC_ERROR;
} /*
* 处理SIGCHLD信号,内核在子进程结束时不会产生僵尸进程
*/
if (signal(SIGHUP, SIG_IGN) == SIG_ERR) {
log_error("signal(SIGHUP, SIG_IGN) failed: %s", strerror(errno));
return NC_ERROR;
} /*
* 再一次fork的原因是之前的子进程虽然已经脱离了控制终端,该子进程已经成为无终端的会话组长。
* 但它可以重新申请打开一个控制终端,可以通过使进程不再成为会话组长来禁止进程重新打开控制终端
*/
pid = fork();
switch (pid) {
case -:
log_error("fork() failed: %s", strerror(errno));
return NC_ERROR; case :
break; default:
/* 1st child terminates */
_exit();
} /* 2nd child continues */ /* change working directory */
/*
* 切换工作目录
*/
if (dump_core == ) {
status = chdir("/");
if (status < ) {
log_error("chdir(\"/\") failed: %s", strerror(errno));
return NC_ERROR;
}
} /* clear file mode creation mask */
/*
* 重设权限掩码
* 进程从创建它的父进程那里继承了文件创建掩码,它可能修改守护进程所创建的文件的存取位。
*/
umask(); /* redirect stdin, stdout and stderr to "/dev/null" */
/*
* 重定向描述符
*/
fd = open("/dev/null", O_RDWR);
if (fd < ) {
log_error("open(\"/dev/null\") failed: %s", strerror(errno));
return NC_ERROR;
} status = dup2(fd, STDIN_FILENO);
if (status < ) {
log_error("dup2(%d, STDIN) failed: %s", fd, strerror(errno));
close(fd);
return NC_ERROR;
} status = dup2(fd, STDOUT_FILENO);
if (status < ) {
log_error("dup2(%d, STDOUT) failed: %s", fd, strerror(errno));
close(fd);
return NC_ERROR;
} status = dup2(fd, STDERR_FILENO);
if (status < ) {
log_error("dup2(%d, STDERR) failed: %s", fd, strerror(errno));
close(fd);
return NC_ERROR;
} if (fd > STDERR_FILENO) {
status = close(fd);
if (status < ) {
log_error("close(%d) failed: %s", fd, strerror(errno));
return NC_ERROR;
}
} return NC_OK;
}
关于各种ID,先贴上一个图,后面再解释

twemproxy源码分析2——守护进程的创建的更多相关文章
- v76.01 鸿蒙内核源码分析(共享内存) | 进程间最快通讯方式 | 百篇博客分析OpenHarmony源码
百篇博客分析|本篇为:(共享内存篇) | 进程间最快通讯方式 进程通讯相关篇为: v26.08 鸿蒙内核源码分析(自旋锁) | 当立贞节牌坊的好同志 v27.05 鸿蒙内核源码分析(互斥锁) | 同样 ...
- Spark源码分析(三)-TaskScheduler创建
原创文章,转载请注明: 转载自http://www.cnblogs.com/tovin/p/3879151.html 在SparkContext创建过程中会调用createTaskScheduler函 ...
- Spring源码分析(十八)创建bean
本文结合<Spring源码深度解析>来分析Spring 5.0.6版本的源代码.若有描述错误之处,欢迎指正. 目录 一.创建bean的实例 1. autowireConstructor 2 ...
- Docker源码分析(二):Docker Client创建与命令执行
1. 前言 如今,Docker作为业界领先的轻量级虚拟化容器管理引擎,给全球开发者提供了一种新颖.便捷的软件集成测试与部署之道.在团队开发软件时,Docker可以提供可复用的运行环境.灵活的资源配置. ...
- twemproxy源码分析1——入口函数及启动过程
最近工作中需要写一个一致性哈希的代理,在网上找到了twemproxy,结合网上资料先学习一下源码. 一.Twemproxy简介 Twemproxy是memcache与redis的代理,由twitter ...
- nova-api源码分析(WSGI server的创建及启动)
源码版本:H版 一.前奏 nova api本身作为一个WSGI服务器,对外提供HTTP请求服务,对内调用nova的其他模块响应相应的HTTP请求.分为两大部分,一是服务器本身的启动与运行,一是加载的a ...
- Spark源码分析(二)-SparkContext创建
原创文章,转载请注明: 转载自http://www.cnblogs.com/tovin/p/3872785.html SparkContext是应用启动时创建的Spark上下文对象,是一个重要的入口 ...
- twemproxy源码分析
twemproxy是twitter开源的redis/memcached 代理,数据分片提供取模,一致性哈希等手段,维护和后端server的长连接,自动踢除server,恢复server,提供专门的状态 ...
- mybatis源码分析(1)-----sqlSessionFactory创建
1. 首先了解一下mybatis,包含核心jar ,以及spring相关jar. <!-- Mybatis相关组件 --> <dependency> <groupId&g ...
随机推荐
- python numpy学习记录
numpy是一个python和矩阵相关的库,在机器学习中非常有用,记录下numpy的基本用法 numpy的数组类叫做ndarray也叫做数组,跟python标准库中的array.array不同,后者只 ...
- Java笔记19:Java匿名内部类
匿名内部类也就是没有名字的内部类.正因为没有名字,所以匿名内部类只能使用一次,它通常用来简化代码编写.但使用匿名内部类还有个前提条件:必须继承一个父类或实现一个接口 例1:不使用匿名内部类来实现抽象方 ...
- php中自定义事件---事件驱动
PHP中自定义事件驱动,处理机制. 原文:https://www.cnblogs.com/mafeifan/p/4322271.html ------------------------------- ...
- (转)Window 上安装Node.js
window上安装nodejs非常的简单,next,next就行了,环境变量都是自动配置,不明白为毛java不这样 Window 上安装Node.js http://www.runoob.com/no ...
- VS提示无法连接到已配置的开发web服务器的解决方法
VS2013每次启动项目调试好好的,今天出现了提示“提示无法连接到已配置的开发web服务器“,使用环境是本地IISExpress,操作系统为windows10,之前也出现过就是重启电脑又好了,这次是刚 ...
- HDU 1104 Remainder (BFS(广度优先搜索))
Remainder Time Limit: 6000/3000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total Sub ...
- WebDriver API——第3部分Action Chains
The ActionChains implementation, class selenium.webdriver.common.action_chains.ActionChains(driver) ...
- javaweb开发所需的技术需求
本文仅为新手想学习javaWeb的提供一些参考,有不足或错误之处可以修改或添加,另希望以后学习者可以同样将自己的心得发来和大家分享...谢谢 1 前台:html,css,javascript 这是最 ...
- XAudio2学习之混音
XAudio2不仅能够进行採样率转换.还能够进行混音.所谓混音就是将多路音频混合成一路进行输出.混音主要是IXAudio2SubmixVoice进行此项功能. 数据由IXAudio2SourceVoi ...
- 【VBA编程】02.调试VBA程序
初次编写程序并不一定能成功的运行,可能其中还存在逻辑上或语法上的错误,此时就需要逐步调试,排查错误,一般情况下,编写程序的工作讲究的是三分编程,七分调试. [代码区域] Sub Second() Di ...