Advanced Programming in UNIX Environment Episode 69
发布日期:2021-10-07 23:47:44
浏览次数:2
分类:技术文章
本文共 3127 字,大约阅读时间需要 10 分钟。
#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 fialed"); return 1; } switch(signo) { case SIGHUP: syslog(LOG_INFO,"Re-reading configuration file"); reread(); break; case SIGTERM: syslog(LOG_INFO,"got SIGTERM; exiting"); return 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++; daemonzie(cmd); if(already_running()) { syslog(LOG_ERR,"deamon already running"); return 1; } 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"); err=pthread_create(&tid,NULL,thr_fn,0); if(err!=0) err_exit(err,"can't create thread"); return 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/80020450 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!
发表评论
最新留言
很好
[***.229.124.182]2024年04月09日 17时57分34秒
关于作者
喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
【小技巧】argc和argv的用法
2019-04-27
学不下去了怎么办?
2019-04-27
二叉树的前中后序遍历(迭代法)(带动画)
2019-04-27
【小技巧】【XShell】【Xftp】Windows桌面与Linux虚拟机互传文件
2019-04-27
【redis入门】Centos下安装redis
2019-04-27
【redis入门】redis安装后相关知识串讲
2019-04-27
【redis】来吧,展示一下redis 发布-订阅模式
2021-06-30
当下热点词再学:redis缓存预热、更新、降级,限流
2021-06-30
【redis6.0.6】redis源码慢慢学,慢慢看 -- 第五天:adlist
2021-06-30
别抖,OK? 操作系统抖动现象、网络抖动与延迟、函数抖动之防抖与节流,串讲
2021-06-30
通过域名获取主机IP -- struct addrinfo
2021-06-30
【C++】算法集锦(8):从两数和问题拓展到一百数和问题
2021-06-30
【C++】算法集锦(9):背包问题
2021-06-30
【C++】算法集锦(10)通俗讲kmp算法
2021-06-30
【C++】算法集锦(12):高楼扔鸡蛋
2021-06-30
【图解】拥塞控制
2021-06-30
线程上下文切换
2021-06-30