Linux 使用信号重新读取服务器配置
Linux server configuration rereading using signals
我正在用 C 语言制作一个服务器,它应该 运行 作为 Linux 操作系统上的守护进程。我还有一个日志系统,我会做一些 UART 读取。我在某处读到,当 运行ning 一个守护进程时,SIGHUP 可用于启动重新读取配置文件并更新一些值。我的问题是,应该如何做到这一点,而不会有在操作中间更改值的潜在危险,这些操作最终应该与开始时的值相同(例如,如果我正在从串行端口读取,我不希望我的波特率在收到包裹的过程中发生变化)。
想到了锁,但我真的不想更改程序,以便它检查某个指示器是否应该更改进入函数的值 before/after。
编辑:
如果有一种方法可以使函数在信号处理的意义上成为原子(信号处理程序将等待这些函数完成后再继续),那也可以解决我的问题。
您定义了一个全局* 布尔变量,该变量在收到信号后设置在信号处理程序中。
然后,您确定主循环中可以安全地重新读取配置文件并重新初始化所需内容的点。在这一点上,您分析所述布尔变量的值(以及任何其他可能的阻塞条件)并采取行动。不要忘记清除该标志变量,这样您就不会在下一次迭代中再次重新初始化所有内容。
* 这里的全局对信号处理程序和主循环都是可见的
我正在用 C 语言制作一个服务器,它应该 运行 作为 Linux 操作系统上的守护进程。我还有一个日志系统,我会做一些 UART 读取。我在某处读到,当 运行ning 一个守护进程时,SIGHUP 可用于启动重新读取配置文件并更新一些值。我的问题是,应该如何做到这一点,而不会有在操作中间更改值的潜在危险,这些操作最终应该与开始时的值相同(例如,如果我正在从串行端口读取,我不希望我的波特率在收到包裹的过程中发生变化)。 想到了锁,但我真的不想更改程序,以便它检查某个指示器是否应该更改进入函数的值 before/after。
编辑: 如果有一种方法可以使函数在信号处理的意义上成为原子(信号处理程序将等待这些函数完成后再继续),那也可以解决我的问题。
您定义了一个全局* 布尔变量,该变量在收到信号后设置在信号处理程序中。
然后,您确定主循环中可以安全地重新读取配置文件并重新初始化所需内容的点。在这一点上,您分析所述布尔变量的值(以及任何其他可能的阻塞条件)并采取行动。不要忘记清除该标志变量,这样您就不会在下一次迭代中再次重新初始化所有内容。
* 这里的全局对信号处理程序和主循环都是可见的