程序从配置文件中读取一些值,一些是定义的,一些不是,一些值为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而不影响其他变量?我确信这不是最好的方法,将它们的值设置为“”
答案 0 :(得分: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 );
答案 1 :(得分: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");
如果要检查更多参数,可以通过检查args的值,使用loop
来形成要传递的args数组。
for(i=0;i<10;i++){
if (args[i]!=default_value_args[i]) {
args_2b_passed[j++]=args[i];
}
}
然后使用args_2b_passed数组使用exec函数的varient。 man 3 exec
获得更多帮助。