首页 > 代码库 > 从时间进程日志上面了解守护进程daemon的使用

从时间进程日志上面了解守护进程daemon的使用

说起进程呢? 在俺心中永远有种高大上的感觉,哈哈,自从了解到了进程方面的东西,也觉得进程这个执行过程真的很神奇,但是在了解到了还有守护进程方面的东东的时候又觉得貌似更加的让俺魂不守舍啦!觉得自己可以做到  觉得从一名屌丝立马逆袭成了高大上啦。O(∩_∩)O哈哈~

那么,进程守护具体是什么呢?相信看这篇文章的牛牛们都对这方面有一定的了解啦。所以就带着复习或者巩固或者挑刺的心理来看看吧。



上面就是大致的创建守护进程的步骤啦,用语言来描述的话,共需要5步即可建立一个守护进程:

1》用fork()函数创建子进程,关闭父进程。

2》在子进程中用setsid()函数建立新的会话。

3》改变进程的工作目录,用chdir。

4》重设文件掩码umask为0。

5》关闭不需要的文件描述符。

以上就是建立守护进程的五个大的步骤啦,在创建守护进程的过程中我们需要注意以下几个问题。

在使用setsid()函数建立新的会话的时候,我们的调用者不能是我们的组长进程,通常的情况下我们的组长进程就是我们的父进程。

好了,大致的思想了解之后,接下来的事情就简单的多了,无非就是代码的实现的问题了;

闲言碎语不要讲,直接上代码:


#include <head.h>

#define daemo_mode 0
#define nomal_mode 1

int  daemo() //5步创建守护进程
{
	pid_t pid;
	pid = fork();
	if(pid < 0)
	{
		fprintf(stderr,"File to fork\n",strerror(errno));
		exit(EXIT_FAILURE);
	}
	if(pid > 0)
		exit(EXIT_FAILURE);
	
	if(setsid() < 0)
	{
		perror("File to setsid");
		exit(EXIT_FAILURE);
	}
	chdir("/");
	umask(0);
	close(0);
	close(1);
	close(2);
	return 0;
}

int get_line(FILE *fp)
{
	int line;
	char *tmp;
	char buf[4096];
	while(1)
	{
		tmp = fgets(buf,sizeof(buf),fp);
		if(tmp == NULL)
			break;
		if(buf[strlen(tmp) - 1] == '\n')
			line++;
	}
	return line;
}

int do_nomal(const char *filename)
{
	FILE * fp;
	time_t t;
	struct tm *ptm;
	int line = 0;

	fp = fopen(filename,"a+");

	if(fp == NULL)
	{
		fprintf(stderr,"File to fopen\n",strerror(errno));
		exit(EXIT_FAILURE);
	}

	line = get_line(fp);

	while(1)
	{
		++line;
		time(&t); //The realization of time
		ptm = localtime(&t);

		sleep(1);
		fflush(fp);
		fprintf(fp,"%d-%d-%d",(1900+ptm->tm_year),(1+ptm->tm_mon),ptm->tm_mday);
		fprintf(fp,"%d:%d:%d\n",ptm->tm_hour,ptm->tm_min,ptm->tm_sec);
	}
	return 0;
}
// ./a.out log 0/1
int main(int argc, const char *argv[])
{
	if(argc < 3)
	{
		fprintf(stderr,"Usage : %s argv[1] argv[2]\n",argv[0]);
		exit(EXIT_FAILURE);
	}
	int mode = atoi(argv[2]);
	switch(mode)
	{
	case daemo_mode:
		daemo();
		break;
	case nomal_mode:
		break;
	default:
		printf("Unknow mode \n");
		goto next;
	}
	do_nomal(argv[1]);

next:
	return 0;
}