1. 程式人生 > >守護進程模型創建思路及詳細實現代碼

守護進程模型創建思路及詳細實現代碼

flags emp val 系統時間 會話 home 控制 sleep pen

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;
}

  

守護進程模型創建思路及詳細實現代碼