Advanced Programming in UNIX Environment Episode 69
发布日期:2021-10-07 23:47:43 浏览次数:2 分类:技术文章

本文共 3512 字,大约阅读时间需要 11 分钟。

#include "apue.h"#include 
#include
sigset_t mask;extern int already_running(void);void reread(void){ /* ... */}void *thr_fn(void *arg){ int err, signo; for (;;) { err = sigwait(&mask, &signo); if (err != 0) { syslog(LOG_ERR, "sigwait failed"); exit(1); } switch (signo) { case SIGHUP: { syslog(LOG_INFO, "Re-reading configuration file"); reread(); break; } case SIGTERM: { syslog(LOG_INFO, "got SIGTERM; exiting"); exit(0); } default: syslog(LOG_INFO, "unexpected signal %d\n", signo); } } return(0);}int main(int argc, char *argv[]){ int err; pthread_t tid; char *cmd; struct sigaction sa; if ((cmd = strrchr(argv[0], ’/’)) == NULL) cmd = argv[0]; else cmd++; /* * Become a daemon. */ daemonize(cmd); /* * Make sure only one copy of the daemon is running. */ if (already_running()) { syslog(LOG_ERR, "daemon already running"); exit(1); } /* * Restore SIGHUP default and block all signals. */ sa.sa_handler = SIG_DFL; sigemptyset(&sa.sa_mask); sa.sa_flags = 0; if (sigaction(SIGHUP, &sa, NULL) < 0) { err_quit("%s: can’t restore SIGHUP default"); } sigfillset(&mask); if ((err = pthread_sigmask(SIG_BLOCK, &mask, NULL)) != 0) { err_exit(err, "SIG_BLOCK error"); } /* * Create a thread to handle SIGHUP and SIGTERM. */ err = pthread_create(&tid, NULL, thr_fn, 0); if (err != 0) { err_exit(err, "can’t create thread"); } /* * Proceed with the rest of the daemon. */ /* ... */ exit(0);}

Daemon rereading configuration files

#include "apue.h"#include 
#include
extern int lockfile(int);extern int already_running(void);void reread(void){}void sigterm(int signo){ syslog(LOG_INFO,"get SIGTERM; exiting"); return 0;}void sighup(int signo){ syslog(LOG_INFO, "Re-reading configuration file"); reread();}int main(int argc, char *argv[]){ char *cmd; struct sigaction sa; if((cmd=strrchr(argv[0],'/'))==NULL) cmd=argv[0]; else cmd++; daemonize(cmd); if(already_running()) { syslog(LOG_ERR,"daemon already running"); return 1; } sa.sa_handler=sigterm; sigemptyset(&sa.sa_mask); sigaddset(&sa.sa_mask,SIGHUP); sa.sa_flags=0; if(sigaction(SIGTERM,&sa,NULL)<0) { syslog(LOG_ERR,"can't catch SIGTERM: %s"strerror(errno)); return 1; } sa.sa_handler=sighup; sigemptyset(&sa.sa_mask); sigaddset(&sa.sa_mask,SIGTERM); sa.sa_flags=0; if(sigaction(SIGHUP,&sa,NULL)<0) { syslog(LOG_ERR,"can't catch SIGHUP: %s", strerror(errno)); return 1; } return 0;}

Alternative implementation of daemon rereading configuration files

Client–Server Model

A common use for a daemon process is as a server process. Indeed, in Figure 13.2, we can call the syslogd process a server that has messages sent to it by user processes (clients) using a UNIX domain datagram socket.

In general, a server is a process that waits for a client to contact it, requesting some type of service.

#include "apue.h"#include 
int set_cloexec(int fd){ int val; if((val=fcntl(fd, F_GETFD,0))<0) return -1; val|=FD_CLOEXEC; return fcntl(fd,F_SETFD,val);}

Set close-on-exec flag

转载地址:https://blog.csdn.net/myfather103/article/details/80006588 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!

上一篇:Enable Audio Device on Windows Server 2008 Guest Host
下一篇:Advanced Programming in UNIX Environment Episode 68

发表评论

最新留言

能坚持,总会有不一样的收获!
[***.219.124.196]2024年04月03日 05时28分01秒