1)創建子進程,父進程退出
2)在子進程中創建新會話
setsid()函數,用於創建一個新會話,並擔任會話組的組長。調用setsid()函數有三個作用:
讓進程擺脫原會話的控制
讓進程擺脫原進程組的控制
讓進程擺脫原控制終端的控制
3) 用chdir()函數改變工作目錄
4)用umask()設置文件權限掩碼
5) 關閉文件描述符
#include <stdio.h> #include <stdlib.h> #include <unistd.h> #include <sys/types.h> #include <fcntl.h> #include <string.h> int main(int argc, const char *argv[]) { pid_t pid; int i,fd; char *buf = "This is a Daemon log\n"; pid = fork(); if(pid < 0) { perror("fail to fork\n"); exit(0); } if(pid > 0) //父進程退出 第一步 { exit(0); } setsid(); //第二步 chdir("/tmp"); //第三步 umask(0); //第四步 for(i = 0;i < getdtablesize();i++) //第五步 循環刪除文件描述符 { close(i); } while(1) { if((fd = open("daemon.log",O_CREAT|O_RDWR|O_APPEND,0667))<0) { perror("fail to open"); exit(1); } write(fd,buf,strlen(buf)); close(fd); sleep(2); } return 0; }