我有以下代码:
int main(int argc, char *argv[])
{
int i, a=9;
int length = 0;
const char fail[20] = "Missing Arguments\n";
char s1[512] = "";
char s2[15] = "./calc_prizes";
for (i=1; i<argc; i++) {
length += sprintf(s1+length, " %s", argv[i]);
}
strcat(s2, s1);
while(++a < argc) {
if(fork() == 0) {
char* arg[] = {s2, s1, NULL}; //this is the part that's wrong
execvp(arg[0],arg);
exit(1);
}
else
wait(NULL);
}
return 0;
}
S2存储程序的名称,s1参数收集参数。我似乎无法使用execvp的参数运行程序,我做错了什么?
答案 0 :(得分:0)
execvp
失败的一个可能原因可能是:
strcat(s2, s1);
[我希望你已经确保s2
足够大以包含连接的结果字符串,否则它的缓冲区溢出,这在你的代码中是一个不同但肯定是个问题。] <登记/>
在这里,您将s1
连接到s2
,s2
是您要执行的程序的名称。在while
循环中,您正在执行:
char* arg[] = {s2, s1, NULL};
arg[0]
指向s2
(连接字符串),并且您将此作为execvp
的第一个参数传递:
execvp(arg[0],arg);
execv(),execvp()和execvpe()函数提供了一个指向以null结尾的字符串的指针数组,这些字符串表示新程序可用的参数列表。 按照惯例,第一个参数应指向与正在执行的文件关联的文件名。指针数组必须以NULL指针终止。 [强调我的]
因此,要成功调用execvp
,您应该将第一个参数作为可执行文件的名称,在您的情况下为./calc_prizes
。