Linux C 创建守护进程步骤
前言
我觉得在学习如何学习创建守护进程前首先应知道何为守护进程,那么什么是守护进程呢?
刘忆智等编著的《Linux从入门到精通》(第2版)一书中是这样定义的:守护进程(daemon)是一类在后台运行的特殊进程,用于执行特定的系统任务。很多守护进程在系统引导的时候启动,并且一直运行直到系统关闭。另一些只在需要的时候才启动,完成任务后就自动结束。而我理解的是:运行于后台,且不会受终端控制的特殊进程。
下面我们先来看下一个创建守护进程的过程。
- 创建孤儿进程(创建子进程,终止父进程):fork(),exit();
- 创建一个新的会话,成为会话组长:setsid();
- 更改程序运行目录:chdir();
- 修改文件掩码:umask();
- 关闭文件描述符:getdtablesize(),close();
下面我们来看下完整的代码:
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <strings.h>
#include <sys/stat.h>
#include <unistd.h>
int main()
{
//成为孤儿
pid_t pid = fork();
if(pid == -1)
{
perror("fork");
exit(-1);
}
else if(pid > 0)
{
exit(0);
}
//创建新会话
if(setsid()== (pid_t)-1)
{
perror("setsid");
exit(-1);
}
//更改运行目录
if(-1 == chdir("/tmp"))
{
perror("chdir");
exit(-1);
}
//修改文件掩码
umask(0);
//关闭文件描述符
int i;
for(i = 0; i < getdtablesize(); i++)
{
close(i);
}
while(1)
{
//任务处理
printf{"Hello World !"};
}
exit(0);
}
下面详细介绍一下几个函数:
创建进程fork()
函数功能:创建一个子进程(相对当前进程)
函数头文件
#include <sys/types.h>
#include <unistd.h>
函数原型:
pid_t fork(void);
函数返回值:
成功:主进程返回子进程pid号,子进程返回0
失败:返回-1和错误码
例如:
pid_t pid = fork();
switch(pid)
{
case -1:
{
perror("Fork");
exit(0);
}
case 0:
{
while(1)
{
//子进程
}
break;
}
default:
{
while(1)
{
//主进程
}
break;
}
}
新建一个会话setsid()
函数功能:创建会话并设置进程组ID
函数头文件
#include <unistd.h>
函数原型
pid_t setsid(void);
函数返回值:
成功:返回会话组id
失败:返回-1和错误码
更改目录chdir()、fchdir()
函数功能:更改工作目录
函数头文件
#include <unistd.h>
函数原型
int chdir(const char *path);
int fchdir(int fd);
函数返回值
成功:返回0
失败:返回-1和错误码
参数说明
path:文件路径
fd:文件描述符
修改文件掩码umask()
函数功能:设置并获取文件模式创建掩码
函数头文件
#include <sys/stat.h>
函数原型
mode_t umask(mode_t cmask);
函数返回值
此函数总是返回为成功,使用时可不做错误判断
参数说明
cmask:权限值
获取文件描述符表大小getdtablesize()
函数功能:获取文件描述符表大小
函数头文件
#include <sys/stat.h>
函数原型
int getdtablesize(void);
函数返回值
当前对每个进程打开的文件数量