linux-守护进程daemon 代码实现 main.c运行结果 代码实现 main.c //pName:程序名 //facility: 守护进程,输出日志类型 302页 #include<signal.h> #include<syslog.h> #include<fcntl.h> static int daemon_proc = 0; #define MAXDF 64 int test_daemon(const char* pName, int facility) { int i; pid_t pid; if((pid = fork()) < 0) { return -1; } else if(pid) //主进程退出 { _exit(0); } //创建新会话 if((setsid() < 0)) { return; } //屏蔽终端挂断的消息 signal(SIGHUP,SIG_IGN); //子进程再fork一次 //防止子进程变成新会话的守进程,当没终端的会话打开终端时,终端最后会变成会话守进程的终端 //为了确保守护进程将来打开终端时也不会获得终端 if((pid = fork()) < 0) { return -1; } else if(pid) { _exit(0); } //标识当前程序是否是守护进程 daemon_proc = 1; //修改工作目录到根目录 chdir("/"); //关闭文件描述符号 for(int i=0; i<MAXDF; ++i) { close(i); } //指定 stdin stdout strerror的日志输出目录 //每个文件都属于自己的句柄,例如标准输入是0,标准输出是1,标准出错是2 //打开0 1 2 防止 创建socket时被占用 int p1 = open("/dev/NULL",O_RDONLY); int p2 = open("/dev/NULL",O_RDWR); int p3 = open("/dev/NULL",O_RDWR); //输出的日志内容在:/var/log/message 中 openlog(pName,LOG_PID,facility); syslog(LOG_DEBUG, "daemon create\r\n"); return 0; } int main(int argc, char **argv) { test_daemon("test_daemon",0); while(1) { syslog(LOG_DEBUG, "daemon test\r\n"); } return 0; } 运行结果