0

程序从配置文件中读取一些值,一些已定义,一些未定义,一些值为 0,一些处于活动状态。

我有以下代码:

    char *arg1="", *arg1_value="", *arg2="", *arg2_value="", *arg3="", *arg3_value="", *arg4="", *arg4_value="";

    //part where I read from config file

    execl("./test", "test", arg1, arg1_value, arg2, arg2_value, arg3, arg3_value, arg4, arg4_value, (char*) 0);

如何使用 execl 但如果某些变量丢失或设置为 0 不影响其他变量?我确定这不是将它们的值设置为“”的最佳方法

4

2 回答 2

1

我假设每个argX都是一个类似的开关"-xxxx",它是相应的值,如果定义argX_value了,你总是想传递两个。argX然后你可以使用execv()而不是execl()这样:

#define MAXARGS  4 

char *argv[2*MAXARGS+2];
int  i, argc;

argv[0] = "prog";
argc = 1;
if( arg1 && strcmp( arg1, "" ) != 0 ) {
     argv[argc++] = arg1;
     argv[argc++] = arg1_value;
}
// the same for arg2 to arg4

argv[argc] = NULL;

execv( "./prog", argv );
于 2013-09-26T10:35:28.043 回答
0

使用默认值初始化参数并传递适当的参数(通过检查值是否为默认值)execl可能是我们在这种情况下的唯一选择。

if(argv1 == defval_arg1)
         execl("./prog","prog", "required args in case argv1 is missing according to syntax of ./prog");
if(argv2 == defval_arg2)
         execl("./prog","prog", "required args in case argv2 is missing");

更新

如果要检查更多参数,您可以loop通过检查 args 的值来简单地使用形成要传递的 args 数组。

for(i=0;i<10;i++){ 
  if (args[i]!=default_value_args[i]) { 
  args_2b_passed[j++]=args[i];
  }
} 

然后使用 args_2b_passed 数组使用各种 exec 函数。man 3 exec寻求更多帮助。

于 2013-09-26T10:25:49.067 回答