- 论坛徽章:
- 1
|
在unix系统中创建守护进程
一段完整的守护进程的代码,有兴趣的可以测试一下。建议收藏。
- #include <stdio.h>;
- #include <fcntl.h>;
- #include <signal.h>;
- #include <unistd.h>;
- #define RUNNING_DIR "/tmp"
- #define LOCK_FILE "exampled.lock"
- #define LOG_FILE "exampled.log"
- void log_message(filename,message)
- char *filename;
- char *message;
- {
- FILE *logfile;
- logfile=fopen(filename,"a");
- if(!logfile) return;
- fprintf(logfile,"%s\n",message);
- fclose(logfile);
- }
- void signal_handler(sig)
- int sig;
- {
- switch(sig) {
- case SIGHUP:
- log_message(LOG_FILE,"hangup signal catched");
- break;
- case SIGTERM:
- log_message(LOG_FILE,"terminate signal catched");
- exit(0);
- break;
- }
- }
- void daemonize()
- {
- int i,lfp;
- char str[10];
- if(getppid()==1) return; /* already a daemon */
- i=fork();
- if (i<0) exit(1); /* fork error */
- if (i>;0) exit(0); /* parent exits */
- /* child (daemon) continues */
- setsid(); /* obtain a new process group */
- for (i=getdtablesize();i>;=0;--i) close(i); /* close all descriptors */
- i=open("/dev/null",O_RDWR); dup(i); dup(i); /* handle standart I/O */
- umask(027); /* set newly created file permissions */
- chdir(RUNNING_DIR); /* change running directory */
- lfp=open(LOCK_FILE,O_RDWR|O_CREAT,0640);
- if (lfp<0) exit(1); /* can not open */
- if (lockf(lfp,F_TLOCK,0)<0) exit(0); /* can not lock */
- /* first instance continues */
- sprintf(str,"%d\n",getpid());
- write(lfp,str,strlen(str)); /* record pid to lockfile */
- signal(SIGCHLD,SIG_IGN); /* ignore child */
- signal(SIGTSTP,SIG_IGN); /* ignore tty signals */
- signal(SIGTTOU,SIG_IGN);
- signal(SIGTTIN,SIG_IGN);
- signal(SIGHUP,signal_handler); /* catch hangup signal */
- signal(SIGTERM,signal_handler); /* catch kill signal */
- }
- main()
- {
- daemonize();
- while(1) sleep(1); /* run */
- }
复制代码
1、编译cc -o exampled examped.c
2、运行./exampled
3、测试daemon进程
ps -ef|grep exampled (or ps -aux on BSD systems)
4、log
tail -f /tmp/exampled.log
5、测试signal
kill -HUP `cat /tmp/exampled.lock`
6、终止
kill `cat /tmp/exampled.lock` |
|