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