1. Fork off the parent process
利用fork()脫離父程序,成為init的子程序
2. Change file mode mask
利用umask()控制Daemon所建立的檔案權限
3. Open any logs for writing
可透過寫檔或是syslog來記錄執行的過程
4. Create a unique Session ID
利用setsid()建立新的session並脫離tty
5. Change the current working directory to a safe place
利用chdir()來改變工作目錄(用意不太清楚)
6. Close standard file descriptors
因為Daemon不會使用terminal,所以關閉不必要的descriptors
7. Enter actual daemon code
Daemon所要執行的程式
程式碼架構可參考此網站
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <syslog.h>
#include <sys/types.h>
#include <sys/stat.h>
#define DAEMON_NAME "MyDaemon"
int main(int argc, char** argv)
{
 pid_t pid, sid;
 // Change file mode mask
 umask(0); 
 
 // Open logs for writing
 openlog(DAEMON_NAME, LOG_CONS | LOG_NDELAY | LOG_PID, LOG_USER);
 syslog(LOG_NOTICE, "%s daemon started", DAEMON_NAME);
 pid = fork();
 if(pid < 0) {
  syslog(LOG_ERR, "Fail to fork a process");
  exit(EXIT_FAILURE);
 }
 
 // Fork off the parent process
 if(pid > 0) {
  exit(EXIT_SUCCESS);
 } 
 
 // Create a unique Session ID
 sid = setsid();
 if(sid < 0) {
  syslog(LOG_ERR, "Fail to create a new Session ID");
  exit(EXIT_FAILURE);
 }
 
 // Change the current working directory
 if((chdir("/") < 0)) {
  syslog(LOG_ERR, "Fail to change the current working directory");
  exit(EXIT_FAILURE);
 }
 
 // Close out the standard file descriptiors
 close(STDIN_FILENO);
 close(STDOUT_FILENO);
 close(STDERR_FILENO);
 
 //******************************************************************
 // Insert the daemon process
 //******************************************************************
 
 exit(EXIT_SUCCESS);
}
