守护进程模型创建思路及详细实现代码

Daemon(精灵)进程,是Linux中的后台服务进程,通常独立于控制终端并且周期性的执行某种任务或者等待处理某些发生的事件,一般采用以d结尾的名字。

特点:

没有控制终端,不能直接和用户交互,不受用户登录,注销的影响,一直运行着

创建守护进程模型:

1,创建子进程,父进程退出

2,在子进程中创建新会话,可使用setsid()函数,使子进程完全独立

3,改变当前目录为根目录,可使用chdir()函数,防止占用可卸载的文件系统

4,重设文件权限掩码,umask()函数 ,防止继承的文件创建屏蔽某些权限

5,关闭文件描述符,继承的打开不会用到

6,开始执行守护进程核心工作

7,守护进程退出处理

具体实现代码:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/types.h>
#include <unistd.h>
#include <fcntl.h>
#include <time.h>
#include <sys/time.h>
#include <signal.h>
#include <sys/stat.h>
#include <errno.h>

int fd;

//信号处理函数
void sighandler(int signo)
{
	//获取系统时间
	time_t tm;
	time(&tm);
	char *p = ctime(&tm);
	write(fd, p, strlen(p));
}

int main()
{
	pid_t pid;
	int ret;

	//创建一个子进程, 然后父进程退出
	pid = fork();
	if(pid<0 || pid>0)
	{
		exit(0);
	}

	//子进程创建新会话
	setsid();

    //改变当前工作目录chdir
	chdir("/home/pig/test");

	//重设文件掩码
	umask(0000);

	//关闭文件描述符
	close(STDIN_FILENO);
	close(STDOUT_FILENO);
	close(STDERR_FILENO);

	//打开一个文件
	fd = open("./test.log", O_RDWR | O_CREAT, 0777);
	if(fd<0)
	{
		perror("open error");
		return -1;
	}

	//注册信号处理函数
	struct sigaction act;
	act.sa_handler = sighandler;
	act.sa_flags = 0;
	sigemptyset(&act.sa_mask);
	sigaction(SIGALRM, &act, NULL);

	//调用setitimer函数定时发送SIGALRM信号
	struct itimerval tm;
	tm.it_interval.tv_sec = 2;
	tm.it_interval.tv_usec = 0;
	tm.it_value.tv_sec = 3;
	tm.it_value.tv_usec = 0;
	setitimer(ITIMER_REAL, &tm, NULL);

	while(1)
	{
		sleep(2);
	}

	close(fd);

	return 0;
}

  

时间: 2024-10-14 05:15:25

守护进程模型创建思路及详细实现代码的相关文章

守护进程的创建方法与步骤

守护进程是运行在后台的一种特殊进程.它独立于控制终端并且周期性地执行某种任务或等待处理某些发生的事件.守护进程是一种很有用的进程,Linux的大多服务器就是用守护进程实现的. 守护进程的创建步骤: 1.使进程在后台运行(创建子进程,父进程退出) if((pid=fork())>0) exit(0); else if (pid<0) { perror("fail to fork"); exit(-1); } 2.脱离控制终端,登录会话和进程组(创建新会话) 进程属于一个进程组

linux下守护进程的创建

最近在学习linux c编程 看到了守护进程的创建,感觉很好玩, 测试环境ubuntu 15.04 下面贴出测试代码 #include <stdio.h> #include <stdlib.h> #include <unistd.h> #include <signal.h> #include <sys/param.h> #include <sys/stat.h> #include <time.h> #include <

Linux系统编程之--守护进程的创建和详解【转】

本文转载自:http://www.cnblogs.com/mickole/p/3188321.html 一,守护进程概述 Linux Daemon(守护进程)是运行在后台的一种特殊进程.它独立于控制终端并且周期性地执行某种任务或等待处理某些发生的事件.它不需要用户输入就能运行而且提供某种服务,不是对整个系统就是对某个用户程序提供服务.Linux系统的大多数服务器就是通过守护进程实现的.常见的守护进程包括系统日志进程syslogd. web服务器httpd.邮件服务器sendmail和数据库服务器

守护进程的创建过程

编写守护进程需要5步 1 创建子进程,父进程结束(让这个进程由init进程托管) pid = fork(); if(pid > 0) //父进程 { exit(0); }2 在子进程中创建新会话(此进程就可以脱离原来进程,脱离控制终端,脱离原来进程组) setsid(); //最主要是脱离控制终端 3 改变当前目录(每一个进程都有一个当前目录), 不是必须的 chdir("/tmp"); 4 重新设置文件权限掩码(不是必须的) umask(0); 5 关闭打开的文件描述符(如果父

创建一个守护进程

一.概述:守护进程也称精灵进程(Daemon),是运行在后台的一种特殊进程.它独立于控制终端并且周期性地执行某种任务或等待处理某些发生的事件.守护进程是随系统启动而存在,随系统关闭而消失的进程(也就是开机之后就会存在,关机才消失).守护进程是一种很有用的进程,Linux的大多数服务器就是用守护进程实现的. 在终端运行命令:ps axj | head 参数a表示不仅列出当前用户进程,也列出所有其它用户进程. 参数x表示不仅列出有控制终端的进程,也列出所有无控制终端的进程. 参数j表示列出与作业控制

创建守护进程步骤与setsid() -- linux deamon进程

原创:http://www.cnblogs.com/mickole/p/3188321.html 一,守护进程概述 Linux Daemon(守护进程)是运行在后台的一种特殊进程.它独立于控制终端并且周期性地执行某种任务或等待处理某些发生的事件.它不需要用户输入就能运行而且提供某种服务,不是对整个系统就是对某个用户程序提供服务.Linux系统的大多数服务器就是通过守护进程实现的.常见的守护进程包括系统日志进程syslogd. web服务器httpd.邮件服务器sendmail和数据库服务器mys

守护进程详解及创建,daemon()使用

一,守护进程概述 Linux Daemon(守护进程)是运行在后台的一种特殊进程.它独立于控制终端并且周期性地执行某种任务或等待处理某些发生的事件.它不需要用户输入就能运行而 且提供某种服务,不是对整个系统就是对某个用户程序提供服务.Linux系统的大多数服务器就是通过守护进程实现的.常见的守护进程包括系统日志进程 syslogd. web服务器httpd.邮件服务器sendmail和数据库服务器mysqld等. 守护进程一般在系统启动时开始运行,除非强行终止,否则直到系统关机都保持运行.守护进

nginx学习十三 初始fork和nginx守护进程ngx_daemon

学习nginx已经有一个多月了,觉得越来越吃力了,主要原因自己总结了一下:1平台是基于linux的,以前几乎没有接触过linux,而nginx使用了很多linux的函数:2就是进程,这个东西接触的也很少,linux的多进程更不用说,而现在正好看到这里,觉得异常的吃力,这不看到nginx守护进程的建立,就找资料好好学习一下,所以本文已学习fork为主要内容. 好了,先看一下nginx的守护进程的建立,然后在学习fork. http://blog.csdn.net/xiaoliangsky/arti

笔记整理--Linux守护进程

Linux多进程开发(三)进程创建之守护进程的学习 - _Liang_Happy_Life__Dream - 51CTO技术博客 - Google Chrome (2013/10/11 16:48:27) Linux多进程开发(三)进程创建之守护进程的学习 2013-07-04 17:25:35 标签:守护进程 daemon Linux多进程开发 系统编程 原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 .作者信息和本声明.否则将追究法律责任.http://liam2199.bl