Daemon程序是一直运行的服务端程序,又称为守护进程。一般在系统后台运行,没有控制终端不与前台交互,Daemon程序通常做为系统服务使用。Daemon是长时间运行的进程,一般在系统启动后就运行,在系统关闭时才结束。通常说Daemon程序在后台运行,是由于它没有控制终端,没法和前台的用户交互。Daemon程序通常都做为服务程序使用,等待客户端程序与它通讯。咱们也把运行的Daemon程序称做守护进程
int daemon (int __nochdir, int __noclose);
若是__nochdir的值为0,则将切换工做目录为根目录; linux
若是__noclose为0,则将标准输入,输出和标准错误都重定向到/dev /null。 shell
通过这个函数调用后的程序将运行在后台,成为一个daemon程序,而linux下大多的服务都是以此方式运行的 服务器
最后生成的路径:/home/pc/workspace/daemon/test 函数
#include <stdio.h> #include <stdlib.h> #include <unistd.h> #include <sys/types.h> int main(int argc, char *argv[]) { FILE* pidfp = fopen( "kmc_sa.pid", "w" ); if ( pidfp == NULL ) { perror("error daemon...\n"); exit( 1 ); } printf("path max %d\n", PATH_MAX); if(daemon(1, 1) < 0) // 若成功,则后面的代码就是后台服务代码 { perror("error daemon...\n"); exit(1); } printf("pid:%d\n", getpid()); // get process id printf("uuid:%d\n", getuid()); // get user id fprintf( pidfp, "%d\n", (int) getpid() ); // 将id保存到文件中,方便后续的关闭进程 fclose( pidfp ); // sleep(10); while(1) { ...具体的后台运行代码 } return 0; }脚本:test.sh
#!/bin/sh echo "hello world", $1 #表示输出第一个参数 case "$1" in start) if [ -x /home/pc/workspace/daemon/test ] ; then #首先判断改程序是否为可执行的,是则开始执行 echo "start..." /home/pc/workspace/daemon/test & fi ;; stop) kill -9 `cat kmc_sa.pid` # 经过以前保存的进程号文件来关闭进程,cat前面的符号不是单引号,而是数字1表明的符号 ;; restart) # 就是讲以前的两步再执行一遍 echo "kill" echo "restart" ;; *) echo "usage: $0 { start | stop | restart}" >&2 exit 1 ;; esac
在上例test.c中,首先是利用daemon建立一个后台进程,在daemon后面的函数将是在后台执行的代码,特别是对于服务器代码而言,是一个while(1)老是监听端口的死循环,所以在关闭后台进程的时候,须要知道后台进程的pid,因此程序中在daemon执行后,利用getpid()函数得到子进程的pid,并将pid保存在一个文件中。 ui
对于脚本程序,因为我并不懂,直接从一个开源的服务器启动脚本copy出来的,其是利用case来判断是执行哪一个命令,须要注意的是在执行以前,首先对文件的属性进行判断,如果可执行文件方才继续执行;关闭进程则利用kill命令和以前保存的进程号来实现 spa