守护进程

来源:互联网 发布:魔力宝贝满档数据 编辑:程序博客网 时间:2024/05/01 10:47
所有守护进程都以超级用户(用户 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 65535int 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);}