您的位置:首页 > 其它

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);
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: