1、概念
守护进程是运行在后台,并且一直在运行的一种特殊进程。它独立于控制终端并且周期性的执行某种任务或等待处理某些事。
Linux的大多数服务器都是用守护进程实现的。
2、Linux的内核守护进程
#ps aux
Init:系统守护进程,他的进程ID是1,负责启动各运行层次的特定服务。
Keventd:为在内核中运行计划执行的函数提供上下文。
Kswapd:页面调出守护进程。将脏页面低速写到磁盘上,从而使这写页面在需要时仍可回收使用。
portmap:端口映射守护进程。
syslogd:可由操作人员将系统信息记录到日志的任何程序使用。
inetd:侦听系统网络接口,以便取得来自网络的各种网络请求。
nfsd、lockd、rpciod:提供网络文件系统的支持。
cron:指定的日期和时间执行指定的命令。
3、C实现Linux守护进程步骤
a.创建子进程,终止父进程
b.子进程中创建新会话
c.更改工作目录
d.重设文件创建掩码
e.关闭文件描述符
4、案例
守护进程每10秒钟向/tmp/log.txt中写入日至。
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <time.h>
#include <signal.h>
#include <sys/param.h>
#include <sys/stat.h>
void init_daemon(void);
int main(void){
FILE *fp;
time_t t;
init_daemon();
while(1){
sleep(10);
if( (fp=fopen("log.txt", "a+")) >= 0){//打开log文件,若没有此文件则创建
t=time(0);
fprintf(fp, "守护进程正在运行,时间是:%s", asctime(localtime(&t)));
fclose(fp);
}
}
return 1;
}
void init_daemon(void){
pid_t pid;
int i;
pid = fork();
if(pid > 0){ //终止父进程
exit(0);
}else if(pid < 0 ){
perror("创建子进程失败\n");
exit(1);
}else if(pid == 0){
setsid();//子进程中创建新会话
chdir("/tmp");//改变工作目录到tmp
umask(0); //重设文件掩码
for(i=0; i<NOFILE;++i){//关闭文件描述符
close(i);
}
return ;
}
}
pid_t setsid(void);
成功返回进程组号GID,失败返回-1,原因存于errno。