#include
#include
#include
#include
#include
#include
#include
#include
#include
char * pid_file = "/var/run/daemon.pid";
int init_daemon()
{
int pid ;
FILE * lockfd = NULL;
int pidno=0;
int lockfile=0;
int val=0;
char buf[256];
struct flock lock;
lockfile=open(pid_file,O_RDWR | O_CREAT, S_IWUSR | S_IRUSR | S_IRGRP | S_IROTH);
if(lockfile<0)
{
exit(1);
}
/* see if we can read the contents of the lockfile: Lockfile exists but cannot be read */
if((val=read(lockfile,buf,(size_t)10))<0)
{
exit(1);
}
/* we read something - check the PID : Lockfile does not contain a valid PID*/
if(val>0)
{
if((val=sscanf(buf,"%d",&pidno))<1)
{
exit(1);
}
}
/* check for SIGHUP */
if(val==1 && (pid=(pid_t)pidno)==getpid())
{
close(lockfile);
return 0;
}
/* parent process goes away.. */
if (pid = fork())
{
exit(0);
}
else if ( pid < 0 )
{
exit(1);
}
/* child continues... */
/* child becomes session leader... */
setsid();
/* place a file lock on the lock file */
lock.l_type=F_WRLCK;
lock.l_start=0;
lock.l_whence=SEEK_SET;
lock.l_len=0;
if(fcntl(lockfile,F_SETLK,&lock)<0)
{
if(errno==EACCES || errno==EAGAIN)
{
fcntl(lockfile,F_GETLK,&lock);
}
exit(1);
}
/* write PID to lockfile... */
lseek(lockfile,0,SEEK_SET);
ftruncate(lockfile,0);
sprintf(buf,"%d\n",(int)getpid());
write(lockfile,buf,strlen(buf));
/* make sure lock file stays open while program is executing... */
val=fcntl(lockfile,F_GETFD,0);
val|=FD_CLOEXEC;
fcntl(lockfile,F_SETFD,val);
close(0);
close(1);
close(2);
chdir("/tmp");
umask(0);
}
int main()
{
FILE *fp=NULL;
time_t t;
init_daemon();
while(1)
{
sleep(5);
if((fp=fopen("daemon.log","a"))!= NULL )
{
t=time(0);
fprintf(fp,"I'm here at %s.",asctime(localtime(&t)) );
fclose(fp);
}
}
return 0;
}