红联Linux门户
Linux帮助

一个Linux守候进程例子

发布时间:2015-02-06 15:39:26来源:linux网站作者:Harry_lyc

其他程序可以调用void daemon_init(const char * cmd)方法,来初始化当前进程为守候进程


#include<stdio.h>  
#include<unistd.h>  
#include<sys/resource.h>  
#include<fcntl.h>  
#include<signal.h>  
#include<syslog.h>  
void daemon_init(const char * cmd);  
int main(int argc, char * argv[])  
{  
daemon_init("liyachao_d");  
time_t ticks;  
while(1)  
{  
sleep(60);  
ticks = time(NULL);  
syslog(LOG_INFO,"%s",asctime(localtime(&ticks)));  
}  
return 0;  
}  
void daemon_init(const char * cmd)  
{  
int i;  
int fd0;  
int fd1;  
int fd2;  
pid_t pid;  
struct rlimit rl;  
struct sigaction sa;  
/*清空文件默认生成权限*/ 
umask(0);  
/*取得最大的文件描述符*/ 
if(getrlimit(RLIMIT_NOFILE,&rl) < 0 )  
{  
printf("can't get file limit.");  
}  
pid = fork();  
if(pid < 0 )  
{  
printf("fork error.");  
exit(1);  
}  
else if(pid > 0)  
{  
exit(0);  
}  
setsid();  
/* 
Ensure future opens won't allocate controlling TTYs. 
 
*/ 
sa.sa_handler =SIG_IGN;  
sigemptyset(&sa.sa_mask);  
sa.sa_flags = 0;  
if(sigaction(SIGHUP,&sa,NULL) < 0 )  
{  
printf("catn't ignore SIGHUP");  
exit(1);  
}  
  
pid = fork();  
if(pid < 0 )  
{  
printf("child fork error.");  
exit(1);  
}  
else if(pid > 0)  
{  
exit(0);  
}  
/*改变工作目录到root*/ 
if(chdir("/") < 0 )  
{  
printf("can't change directory to /");  
exit(1);  
}  
/*关闭所有的文件描述符*/ 
if (rl.rlim_max == RLIM_INFINITY)  
{  
rl.rlim_max = 1024;  
}  
for (i = 0; i < rl.rlim_max; i++)  
{  
close(i);  
}  
/*重定向文件描述符0,1,2,到/dev/null*/ 
fd0 = open("/dev/null",O_RDWR);  
fd1 = open("/dev/null",O_RDONLY);  
fd2 = open("/dev/null",O_RDWR);  
openlog(cmd, LOG_CONS, LOG_DAEMON);  
/*初始化日志文件*/ 
if (fd0 != 0 || fd1 != 1 || fd2 != 2)
{  
syslog(LOG_ERR, "unexpected file descriptors %d %d %d",fd0, fd1, fd2);  
exit(1);  
 
}  
}