如何重新加载系统守护程序?

时间:2011-03-31 07:30:28

标签: c networking system

我需要重新加载Squid守护进程,解决方法是:

system("/etc/init.d/squid reload\n"); 

但我认为必须有一个比使用“系统”调用更有效的解决方案,我应该使用什么C指令?

非常感谢。

2 个答案:

答案 0 :(得分:3)

让Squid重新加载配置文件的绝对最快方法是使用SIGHUP signal向守护进程发送kill()。这就是squid -k reconfigure所做的事情,而这正是/etc/init.d/squid reload最有可能做的事情。

这种方法的问题是你必须以某种方式在C代码中发现squid守护进程的进程ID。 PID通常存储在/var/run(在我的情况下为/var/run/squid.pid)下的某个文本文件中,您可以读入 - 这可以节省您查看流程表的麻烦,但它仍然是有点乱。

考虑到/etc/init.d/squid也可能正在执行自定义操作,并且您不必每隔一秒左右重新加载守护程序,我会说您应该使用当前的解决方案。如果您不关心脚本的返回状态,您也可以使用常见的fork()exec()方法,这种方法是异步的,因此从您的应用程序的角度来看更快。

答案 1 :(得分:2)

如果你真的需要一个更快的解决方案,你可以使用fork和exec,但由于必须运行squid init脚本,并且Squid必须完成这项工作,所以C程序的任何优化都只会带来非常小的改进。

编辑:

另一方面(在查看了Squid手册之后),一些守护进程对信号做出反应,而Squid似乎也这样做了。例如,如果您向其发送HUP信号,它会重新读取其配置文件:

kill(process-id-of-the-squid-dameon, SIGHUP);