没有一个守护进程具有控制终端—终端名称设置为问号(?)、终端前台进程组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); }