守护进程
所有守护进程都以超级用户(用户 ID为0)的优先权运行
没有一个守护进程具有控制终端—终端名称设置为问号(?)、终端前台进程组ID设置为-1
所有这些守护进程的父进程都是init进程(进程D为1) /* 以下示例仅作参考不做正确保证*/
没有一个守护进程具有控制终端—终端名称设置为问号(?)、终端前台进程组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);
}

浙公网安备 33010602011771号