C实现Linux守护进程

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。

你可能感兴趣的:(c,linux,工作,网络,cron,FP)