在c中重新加载linux服务

我想在c和cgi代码中重新启动apache,bind,proftpd等linux服务

我使用system()来做到这一点,例如:

system ("service httpd reload"); 

我也设置编译的程序suid并运行它。 但不工作,并返回权限的错误。

我该怎么办 ?

编辑:我的Apache日志错误:

 [Wed Dec 21 21:07:13 2011] [error] [client *] cannot remove `/var/run/httpd.pid' [Wed Dec 21 21:07:13 2011] [error] [client *] : Permission denied [Wed Dec 21 21:07:13 2011] [error] [client *] [Wed Dec 21 21:07:13 2011] [error] [client *] touch: [Wed Dec 21 21:07:13 2011] [error] [client *] cannot touch `/var/lock/subsys/httpd' [Wed Dec 21 21:07:13 2011] [error] [client *] : Permission denied 

和相同的日志命名,proftpd等

这里有几件事要检查:

  1. 确保编译的程序具有suid root(即程序的所有者为root)。
  2. 确保正在执行程序的分区没有“noexec”选项。

您需要成为root才能成功运行/usr/sbin/service命令。

所以你的问题是你的应用程序如何获得root权限。

如果您的应用程序是您(合法)不想授予root访问权限的CGI,那么您可以编写一个setuid root并且只​​能从您的CGI运行的包装程序(或者至少从下面的uid它正在运行)。

但是你确定你确实想从CGI上运行这样的东西吗? (你可以学习webmin的工作方式)。