Linux下的守护进程实例
源代码在线查看: deamon.c
/* *守护进程实例包括两部分:主函数main()和初始化函数init_deamon() * *主函数每隔5秒控制实验板上的led灯。 *初始化函数init_deamon()负责生成守护进程。 * *编译:gcc -g -Wall -o deamon deamon.c *执行:./deamon *查看进程:ps -ef */ #include #include #include #include #include #include #include #include #define MAXFILE 65535 #define LED_ON_ALL 0xF
#define LED_OFF_ALL 0x0 void init_deamon(); int main(int argc,char *argv[]) { FILE *fp; time_t t; init_deamon(); while(1){ if((fp=fopen("dexinmeng.log","a")) >=0){ t=time(0); fprintf(fp,"Im here at %s\n",asctime(localtime(&t))); fclose(fp); } sleep(5); } return EXIT_SUCCESS; } /* *生成守护进程 */ void init_deamon() { int pid; int i; /* 为避免挂起控制终端将Daemon放入后台执行 */ if(pid = fork()) exit(0);//父进程退出,子进程继续 else if(pid < 0) exit(1);//fork失败 //是第一子进程,后台继续执行 //第一子进程成为新的会话组长和进程组长 /* 进程成为新的会话组长和新的进程组长,并与原来的登录会话和进程组脱离,进程同时与控制终端脱离 */ setsid(); if(pid = fork()) exit(0);//结束第一子进程 else if(pid< 0) exit(1);//fork失败,退出 //是第二子进程,继续 //第二子进程不再是会话组长 /* 关闭从父进程那里继承了打开的文件描述符 */ for(i = 0; i < MAXFILE; ++i) close(i); /* 改变当前工作目录 */ chdir("/tmp"); /* 将文件创建掩模清除,防止父进程修改守护进程所创建的文件的存取位 */ umask(0); return; }