【发布时间】:2015-04-01 06:46:03
【问题描述】:
好的,我正在尝试构建一个守护程序(用于 Debian 机器),它将接收它(通过 cron)接收的命令行参数并将它们传递给不同的脚本文件。
守护进程的main()是
int main(int argc , char *argv[])
{
if(argc != 3)
{
exit(0);
}
daemonize(argv[1], argv[2]);
return 0;
}
并且函数 daemonize 有这个设置
int daemonize(const char *cmd1, const char *cmd2) {...}
daemonize 中令人不安的部分在这里:
if (strcmp(cmd1,"sample_script") == 0)
{
static char *argv[] = {"/etc/init.d/sample_script", ["%s",cmd2], NULL };
execv("/etc/init.d/sample_script",argv);
exit(127);
}
上线
static char *argv[] = {"/etc/init.d/sample_script", ("%s",cmd2), NULL };
我收到了这个错误
initializer 元素不是常量('argv[1]' 的初始化附近)
显然("%s",cmd2) 是错误的。因为使用“开始”可以正常工作。
那么,如何让cmd2 正确放入*argv[]?还是我做错了什么?
【问题讨论】:
-
你需要函数参数为 const char *
-
你确定你的
argv值在daemonize函数中是正确的。由于您的*argv[] = {"/etc/init.d/sample_script", ...}并将其传递给execv,因此/etc/init.d/sample_script被重复两次,相当于在命令行中以/etc/init.d/sample_script /etc/init.d/sample_script ..运行。如果您可以提供示例输入和预期输出,那就更容易了 -
初始化器中的
[ ...]符号应该是什么? -
@JensGustedt 谢谢你的提问。基本上,daemonize 函数会进行双重分叉,因此父进程位于 init 中。然后它将调用不同的脚本(取决于 cmd1)并将 cmd2 传递给它们。这样,这些脚本也只有 init 作为父进程。无论如何,这就是计划。
-
我的问题更基本,您提供的语法对我来说毫无意义。事实上,您使用的是一个 designated initializer,其中包含一个逗号表达式。这肯定不是你想要的。