1.fork出子进程,然后父进程退出

2.更改会话

3.更改工作目录

4.更改umask

5.关闭文件描述符

 

 

下面我用一个简单的例子来说明。

init.c

1 #include <unistd.h>
 2 #include <signal.h>
 3 #include <sys/param.h>
 4 #include <sys/types.h>
 5 #include <sys/stat.h>
 6 
 7 void init_daemon(void){
 8     int pid;
 9     int i;
10     if(pid = fork()){
11         exit(0);
12     }else if(pid < 0){
13         exit(1);
14     }
15 
16     setsid();
17 
18     if(pid = fork()){
19         exit(0);
20     }else if(pid < 0){
21         exit(1);
22     }
23 
24     for(i=0;i<NOFILE;++i){
25         close(i);
26     }
27 
28     chdir("/tmp");
29     umask(0);
30     return 0;
31 }

testDaemon.c

1 #include <stdio.h>
 2 #include <time.h>
 3 
 4 void init_daemon(void);
 5 
 6 void main(){
 7     FILE *fp;
 8     time_t t;
 9     init_daemon();
10     
11     while(1){
12         sleep(60);
13         if((fp = fopen("test.log","a")) >= 0){
14             t = time(0);
15             fprintf(fp,"Im here at %s\n",asctime(localtime(&t)));
16             fclose(fp);
17         }
18     }
19 }

然后用gcc编译成可执行文件就OK了。
这个Daemon会定时的向文件中写入一条log