任何人都可以告诉我 我们是否可以将变量作为命令行参数传递给c中的execvp()。 如果是这样,怎么通过? 有没有其他方法在调用可执行文件时传递变量?
我的代码段是
struct sample
{
int links[100],nodes[100],hosts[100],linkcount,nodecount,hostcount;
};
int main()
{
pid_t process;
struct sample s1;
//assigned values to all the structure members.
const char* command ="./abc";
process=fork();
if(process < 0)
{
perror("fork failure");
exit(1);
}
if(process == 0)
{
execvp(command,NULL);/*Can I pass entire structure as commandline argument in execvp(command,&s1,NULL)*/
}
else
{
wait(NULL);
printf("child is dead..parent process is resuming");
}
return 0;
}
答案 0 :(得分:2)
是。只需创建一个包含参数字符串的buf和一个argv,这是一个指向buf中参数的指针数组。这是一段代码:
char *argv[128];
char buf[8192]; // Each argument string in this buffer is null-terminated.
int argc = 0;
// ...
// The first argument is the command, so we copy it to buf and make it pointed by argv[0].
const char* command ="./abc";
strcpy(buf, command);
argv[argc++] = buf;
buf += strlen(command) + 1;
// The second argument will be saved after the first one in buf and is pointed by argv[1].
char * arg = itoa(s1.id, 10);
strcpy(buf, arg);
argv[argc++] = buf;
// Required.
argv[argc] = NULL;
// ...
// Then you can call execvp!
execvp(command, argv);
请注意,此代码段不安全。有关更多详细信息,请参阅下面的Jonathan Leffler的评论。
有关详细信息,请参阅http://linux.die.net/man/3/execvp。
答案 1 :(得分:0)
你可以(使用execl()),但它必须是一个字符串(const char*
)。要将int
转换为字符串,请使用itoa()
。然后你可以这样执行./abc 10
:
execl(command, command, itoa(s1.id, 10), NULL);
itoa
的第二个参数是基础。
如果必须使用execvp()
,则需要一个字符串数组,其中NUM_ARGS是参数个数:
char **args=malloc(sizeof(char*)*NUM_ARGS);
args[0]=itoa(s1.id, 10);
execvp(command, args);