其他程序可以调用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);
- }
- }