任何人都可以发布一些示例代码,说明如何在守护程序收到SIGHUP信号后重新读取配置文件并重启我的守护程序.守护进程是在Linux上用C编写的用户空间程序,不是由inetd启动的.
根据您的程序编写的干净程度,有(至少)三种方法:
收到信号后,在初始化阶段之前(可能 - 但不一定 - 通过setjmp()/ longjmp()或sigsetjmp()/ siglongjmp()对)返回程序的开头,从而重置并重新读取配置文件.
收到信号后,让信号处理程序再次执行原始程序.这具有丢失所有状态并将所有全局变量和静态变量重置回其原始状态的优点.它有失去所有以前的状态的缺点.
第三种选择可能不那么残酷; 它会注意到信号已被接收,并且在主处理循环中的下一个方便点,将返回并重新读取配置文件.
什么工作取决于你的守护进程必须做什么.如果它花时间与客户进行对话,您可能不想使用选项1或2中的任何一个 - 您更愿意使用选项3.如果您对简单问题做一次性答案,那么残酷的方法可能是有效(并且可能更容易编程).请注意,选项1需要仔细处理WIP(正在进行的工作)和诸如打开文件之类的事情 - 如果您不小心,您将失去对资源的跟踪,并且守护程序将失败(内存不足,文件描述符之外 - 最有可能是这两个中的一个).