mydaemon.c
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <fcntl.h>
#include <signal.h>
//#include <syslog.h>
static FILE* fp = NULL;
#define FNAME "/tmp/out"
static void daemon_exit(int signo)
{
fclose(fp);
//closelog();
exit(0);
}
static int daemonize(void)
{
pid_t pid = fork();
if( pid < 0)
{
return -1;
}
if(pid >0)
{
printf("parent exit\n");
exit(0);
}
else{
printf("this is son \n");
int fd = open("/dev/null",O_RDWR);
if( fd < 0)
{
perror("open()");
return -1;
}
int ret = dup2(fd,0);
if( ret == -1)
{
perror("dup2");
}
ret = dup2(fd,1);
if( ret == -1)
{
perror("dup2");
}
ret = dup2(fd,2);
if( ret == -1)
{
perror("dup2");
}
if( fd > 2)
close(fd);
pid_t spid = setsid();
printf("sessionid:%d\n",spid);
chdir("/");
// umask(0);
}
return 0;
}
int main( int argc,char** argv)
{
// signal(SIGINT,daemon_exit)
// signal(SIGQUIT,daemon_exit);
// signal(SIGTERM,daemon_exit);
struct sigaction sa;
sa.sa_handler = daemon_exit;
sigemptyset(&sa.sa_mask);
sigaddset(&sa.sa_mask,SIGQUIT);
sigaddset(&sa.sa_mask,SIGTERM);
sigaddset(&sa.sa_mask,SIGINT);
sa.sa_flags = 0;
sigaction(SIGINT,&sa,NULL);
sigaction(SIGQUIT,&sa,NULL);
sigaction(SIGTERM,&sa,NULL);
if(daemonize()){
exit(1);
}
fp = fopen(FNAME,"w");
if( fp == NULL)
{
perror("fopen()");
exit(0);
}
for(int i = 0 ; ;i++)
{
sleep(1);
fprintf(fp,"%d\n",i);
fflush(fp);
}
exit(0);
}