我们可以在c中的execvp()中将变量作为命令行参数传递

时间:2014-07-16 14:55:57

标签: c execvp

任何人都可以告诉我 我们是否可以将变量作为命令行参数传递给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;
}

2 个答案:

答案 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);