Some guru's code for daemon.
2004-11-22 17:39
288 查看
#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(char *filename,char *message){
FILE *logfile;
logfile=fopen(filename,"a");
if(!logfile)
return;
fprintf(logfile,"%s/n",message);
fclose(logfile);
}
void signal_handler(int sig){
switch(sig){
case SIGHUP:
log_message(LOG_FILE,"hangup siganl catched");
signal(SIGHUP,signal_handler);
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*/
setsid();
for(i=getdtablesize();i>=0;--i)close(i); /*close all descriptors*/
i=open("/dev/null",O_RDWR);
dup(i);
dup(i);
umask(027);
chdir(RUNNING_DIR);
lfp=open(LOCK_FILE,O_RDWR|O_CREAT,0640);
if(lfp<0)exit(1);
if(lockf(lfp,F_TLOCK,0)<0)
exit(0);/*can't lock*/
/*first instance continues*/
sprintf(str,"%d/n",getpid());
write(lfp,str,strlen(str));
signal(SIGCHLD,SIG_IGN);
signal(SIGTSTP,SIG_IGN);
signal(SIGTTOU,SIG_IGN);
signal(SIGTTIN,SIG_IGN);
signal(SIGHUP,signal_handler);
signal(SIGTERM,signal_handler);
}
int main(void){
daemonize();
while(1) sleep(1);
}
#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(char *filename,char *message){
FILE *logfile;
logfile=fopen(filename,"a");
if(!logfile)
return;
fprintf(logfile,"%s/n",message);
fclose(logfile);
}
void signal_handler(int sig){
switch(sig){
case SIGHUP:
log_message(LOG_FILE,"hangup siganl catched");
signal(SIGHUP,signal_handler);
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*/
setsid();
for(i=getdtablesize();i>=0;--i)close(i); /*close all descriptors*/
i=open("/dev/null",O_RDWR);
dup(i);
dup(i);
umask(027);
chdir(RUNNING_DIR);
lfp=open(LOCK_FILE,O_RDWR|O_CREAT,0640);
if(lfp<0)exit(1);
if(lockf(lfp,F_TLOCK,0)<0)
exit(0);/*can't lock*/
/*first instance continues*/
sprintf(str,"%d/n",getpid());
write(lfp,str,strlen(str));
signal(SIGCHLD,SIG_IGN);
signal(SIGTSTP,SIG_IGN);
signal(SIGTTOU,SIG_IGN);
signal(SIGTTIN,SIG_IGN);
signal(SIGHUP,signal_handler);
signal(SIGTERM,signal_handler);
}
int main(void){
daemonize();
while(1) sleep(1);
}
相关文章推荐
- window.open详解
- MSN/QQ中的CRichEditCtrl:动画表情的实现
- 昨晚去吃了顿日本料理
- 利用XSLT把ADO记录集转换成XML[转帖]
- C#读写注册表
- 如何在delphi下和.net建立的webservice 进行协同工作
- AO入门篇:《创建一个dbf文件 》(Create a new dBASE table )
- 常用工具
- 10g: Datafile Corruption possible from CREATE
- tiles
- The Moment
- 你偷走你的今天了吗?(转)
- 关于C++的一些特别的站点
- http://txt.mop.com/static/953/880/4880953.html
- 在需求采集时,如何对客户的需求进行分类
- 零零碎碎 (都是随手扔上来的东东,还没来得及整理.)
- Java中的Big/Little问题
- Java之旅(9)多态性
- 洗礼
- 银河网络(搞RHCE培训)让我失望