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"#includeint 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 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!
发表评论
最新留言
能坚持,总会有不一样的收获!
[***.219.124.196]2024年04月03日 05时28分01秒
关于作者
喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
Android从触碰屏幕开始的事件采集,解析及分发(1)
2019-04-26
福利来袭,免费获取 Android 开发资料以及直播课程
2019-04-26
优势丧失
2019-04-26
歪门邪道
2019-04-26
理解String.intern()和String类常量池疑难解析例子
2019-04-26
LeetCode题解(1175):质数排列(Python)
2019-04-26
【Android平台】 Alljoyn学习笔记二 编译自带的demo的步骤
2019-04-26
【Android平台】 Alljoyn学习笔记四 Android Core API参考
2019-04-26
【Alljoyn】Alljoyn学习笔记五 AllJoyn开源技术基础概念解析
2019-04-26
【Alljoyn】 Alljoyn学习笔记六 Alljoyn基本概念
2019-04-26
【Alljoyn】 Alljoyn学习笔记七 Alljoyn瘦客户端库介绍
2019-04-26
【Android】Activity生命周期
2019-04-26
【Android】Activity的四种launchMode
2019-04-26
【Android】Activity的task相关
2019-04-26
【Android】 Intent应用详解
2019-04-26
【Android】 Intent详解
2019-04-26
【Android】 常用的Intent
2019-04-26
Android中AsyncTask的简单用法
2019-04-26
【Android】 Android中Log调试详解
2019-04-26