一、什么是守护进程
在Linux中,系统引导时会开启很多服务,这些服务就叫做守护进程。
二、守护进程的特点
守护进程脱离于终端,是运行在后台的进程。
三、守护进程创建步骤
- 创建子进程,父进程退出
//fork --> #include <unistd.h>
// --> pid_t fork(void);
// --> create a child process
pid_t pid = 0;
//创建子进程
pid = fork();
//如果创建失败,则报错,然后退出
if(pid < 0){
perror("fork");
exit(-1);
}
//如果创建成功,则退出父进程
if(pid > 0){
exit(-1);
}
- 在子进程中创建新会话
//setsid --> #include <unistd.h>
// --> pid_t setsid(void);
// --> creates a session and sets the process group ID
pid = setsid();
if(pid < 0){
perror("setsid");
exit(-1);
}
- 改变当前进程目录为根目录
//chdir --> #include <unistd.h>
// --> int chdir(const char *path);
// --> change working directory
int cd = 0;
cd = chdir("/");
if(cd < 0){
perror("chdir");
exit(-1);
}
- 重设文件权限掩码
//umask --> #include <sys/types.h>
// --> #include <sys/stat.h>
// --> mode_t umask(mode_t mask);
// --> set file mode creation mask
- 关闭文件描述符
//sysconf --> #include <unistd.h>
// --> long sysconf(int name);
// --> get configuration information at run time
//_SC_OPEN_MAX --> The maximum number of files that a process can have open at any time.
long filenum = 0;
//统计一个进程中最多包涵多少个文件
filenum = sysconf(_SC_OPEN_MAX);
for(long i = 0; i < filenum; i++){
close(i);
}
四、实现例程
/* *学校:河北大学 *作者:来智慧 *时间:2016年8月16日 *函数功能:创建守护进程 */
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <stdlib.h>
#include <stdio.h>
int main(void)
{
creat_demo();
while(1)
{
printf("I'm running.\n");
sleep(1);
}
return 0;
}
/*创建守护进程*/
void creat_demo(void)
{
/*创建子进程,父进程退出*/
pid_t pid = 0;
if(pid < 0){
perror("fork");
exit(-1);
}
if(pid > 0){
exit(-1);
}
/*在子进程中创建新会话*/
pid = setsid();
if(pid < 0){
perror("setsid");
exit(-1);
}
/*改变当前目录为根目录*/
int cd = 0;
cd = chdir("/");
if(cd < 0){
perror("chdir");
exit(-1);
}
/*重设文件权限掩码*/
umask(0);
/*关闭文件描述符*/
long filenum = 0;
filenum = sysconf(_SC_OPEN_MAX);
for(long i = 0; i < filenum; i++){
close(i);
}
}
open("/dev/null", O_RDWR);
open("/dev/null", O_RDWR);
open("/dev/null", O_RDWR);