linux 守护进程创建流程
2024-10-12 22:52:04
#include <sys/stat.h>
#include <fcntl.h>
/* Bit-mask values for 'flags' argument of becomeDaemon() */ #define BD_NO_CHDIR 01 /* Don't chdir("/") */
#define BD_NO_CLOSE_FILES 02 /* Don't close all open files */
#define BD_NO_REOPEN_STD_FDS 04 /* Don't reopen stdin, stdout, and
stderr to /dev/null */
#define BD_NO_UMASK0 010 /* Don't do a umask(0) */ #define BD_MAX_CLOSE 8192 /* Maximum file descriptors to close if
sysconf(_SC_OPEN_MAX) is indeterminate */
int becomeDaemon(int flags) /* Returns 0 on success, -1 on error */ {
int maxfd, fd; switch (fork()) /* Become background process */
{
case -: return -;
case : break; /* Child falls through... */
default: _exit(EXIT_SUCCESS); /* while parent terminates */
} if (setsid() == -) /* Become leader of new session */
return -; switch (fork()) { /* Ensure we are not session leader */
case -: return -;
case : break;
default: _exit(EXIT_SUCCESS);
} if (!(flags & BD_NO_UMASK0))
umask(); /* Clear file mode creation mask */ if (!(flags & BD_NO_CHDIR))
chdir("/"); /* Change to root directory */ if (!(flags & BD_NO_CLOSE_FILES)) { /* Close all open files */
maxfd = sysconf(_SC_OPEN_MAX);
if (maxfd == -) /* Limit is indeterminate... */
maxfd = BD_MAX_CLOSE; /* so take a guess */ for (fd = ; fd < maxfd; fd++)
close(fd);
} if (!(flags & BD_NO_REOPEN_STD_FDS)) {
close(STDIN_FILENO); /* Reopen standard fd's to /dev/null */ fd = open("/dev/null", O_RDWR); if (fd != STDIN_FILENO) /* 'fd' should be 0 */
return -;
if (dup2(STDIN_FILENO, STDOUT_FILENO) != STDOUT_FILENO)
return -;
if (dup2(STDIN_FILENO, STDERR_FILENO) != STDERR_FILENO)
return -;
} return ;
}
最新文章
- 解决gradle /Users/xxxx/Documents/workspace/fontmanager/.gradle/2.2.1/taskArtifacts/cache.properties (No such file or directory)报错办法
- canvas绘制文字
- Js 日期操作
- mac下8080端口到80端口的转发
- Google搜索技术
- 初次踏上GUI编程之路(有点意思,详细介绍了菜鸟的学习之路)
- bzoj1684 [Usaco2005 Oct]Close Encounter
- 正式学习React(一) 开始学习之前必读
- application(expand)--easyui
- DB2常用sql demo
- javascript 基础系列(一)
- Maven坐标机制
- Android第三次作业
- Linux并发与同步专题 (2)spinlock
- unity3d平铺图片
- LeetCode--349--两个数组的交集
- .NET异步多线程,Thread,ThreadPool,Task,Parallel,异常处理,线程取消
- 提高PHP编码的一些技巧
- C#字符串中特殊字符的转义
- hadoop招聘需求每天都在添加,短短半个月时间,需求量差点儿翻了一番,这是大数据要爆发的节奏么?