守护进程

所有守护进程都以超级用户(用户 ID为0)的优先权运行
没有一个守护进程具有控制终端—终端名称设置为问号(?)、终端前台进程组ID设置为-1
所有这些守护进程的父进程都是init进程(进程D为1)  /* 以下示例仅作参考不做正确保证*/
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<fcntl.h>
#include<sys/types.h>
#include<unistd.h>
#include<sys/wait.h>
#define MAXFILE 65535
int main() {
	pid_t pc;
	int i, fd, len;
	char *buf = "This is a Dameon\n";
	len = strlen(buf);
	pc = fork();
	if(pc < 0) {
		printf("error fork\n");
		exit(1);
	}
	else if(pc > 0)
		exit(0);  // 关闭父进程,我们需要的进程不可以是一个进程组的首进程,这是 setsid 的条件
	setsid();
    /* 调用 setsid 以创建一个新的会话,并担任该会话组的组长。调用 setsid 作用有三个: 成为新对话期的首进程,成为一个新进程组的首进程,脱离控制终端。
       (会话组是一个或多个进程组的集合) */
	chdir("/");
	umask(0); //重设文件权限掩码
	for(i = 0; i < MAXFILE; i++)
		close(i);
	while(1) {
		if((fd = open("/tmp/dameon.log", O_CREAT|O_WRONLY|O_APPEND, 0600)) < 0) {
			perror("open"); /*void perror(const char *s); perror ("open_port");用来将上一个函数发生错误的原因输出到标准设备(stderr)。参数 s 所指的字符串会先打印出,后面再加上错误原因字符串*/
			exit(1);
		}
		write(fd, buf, len+1);
		close(fd);
		sleep(10);
	}
	exit(0);
}

posted @ 2013-03-26 08:34  小尼人00  阅读(142)  评论(0编辑  收藏  举报