使用 execvp 进行 c 编程
c programming using execvp
我正在做一个副项目,我想生成 5 个子进程,然后将 execvp 执行到另一个名为 isEven 的程序中,该程序将判断传递给它的数字是否为偶数。但是,execvp 调用一直失败,因为我在 gdb 中 运行 它并且它不执行。
Args 和 load(args) 都在另一个函数中调用。
提前致谢!!!
//Code to load binary
void load(char* args[])
{
execvp("./isEven", args);
printf("ERROR\n");
}
//args being passed in
char *args[] = {"./isEven", number, NULL};
load(args);
这是我编写的一个较小的程序,它与我现在正在尝试做的事情相同。 Gdb 说我遇到了分段错误。
int main(int argc, char *argv[])
{
int returnCode = fork();
if(returnCode == 0)
{
char *args[] = {"./isEven", 12345, NULL};
execvp("./isEven", args);
printf(errno);
printf("ERROR: execvp failed\n");
exit(-1);
}
else if(returnCode < 0)
{
fprintf(stderr, "fork failed\n");
}
else
{
//i am the parent
printf("I am the parent");
}
return 1;
}
主要问题出在这一行:
char *args[] = {"./isEven", 12345, NULL};
传递给execvp
的args
必须是char*
的数组。将 12345
作为参数使其将其解释为地址并且它不太可能是有效地址。无论如何,这不是您想通过的。也一样:
char *args[] = {"./isEven", "12345", NULL};
您需要将number
转换成字符串。例如:
int number = 12345;
char num_str[256];
snprintf(num_str, sizeof num_str, "%d", number);
char *args[] = {"./isEven", num_str, NULL};
execvp("./isEven", args);
perror("exec");
在您修改后的示例中,您将 errno
打印为:
printf(errno);
这将失败,因为 printf
需要一个字符串作为它的第一个参数。您可以使用 perror()
打印如上所示的错误。
我正在做一个副项目,我想生成 5 个子进程,然后将 execvp 执行到另一个名为 isEven 的程序中,该程序将判断传递给它的数字是否为偶数。但是,execvp 调用一直失败,因为我在 gdb 中 运行 它并且它不执行。 Args 和 load(args) 都在另一个函数中调用。
提前致谢!!!
//Code to load binary
void load(char* args[])
{
execvp("./isEven", args);
printf("ERROR\n");
}
//args being passed in
char *args[] = {"./isEven", number, NULL};
load(args);
这是我编写的一个较小的程序,它与我现在正在尝试做的事情相同。 Gdb 说我遇到了分段错误。
int main(int argc, char *argv[])
{
int returnCode = fork();
if(returnCode == 0)
{
char *args[] = {"./isEven", 12345, NULL};
execvp("./isEven", args);
printf(errno);
printf("ERROR: execvp failed\n");
exit(-1);
}
else if(returnCode < 0)
{
fprintf(stderr, "fork failed\n");
}
else
{
//i am the parent
printf("I am the parent");
}
return 1;
}
主要问题出在这一行:
char *args[] = {"./isEven", 12345, NULL};
传递给execvp
的args
必须是char*
的数组。将 12345
作为参数使其将其解释为地址并且它不太可能是有效地址。无论如何,这不是您想通过的。也一样:
char *args[] = {"./isEven", "12345", NULL};
您需要将number
转换成字符串。例如:
int number = 12345;
char num_str[256];
snprintf(num_str, sizeof num_str, "%d", number);
char *args[] = {"./isEven", num_str, NULL};
execvp("./isEven", args);
perror("exec");
在您修改后的示例中,您将 errno
打印为:
printf(errno);
这将失败,因为 printf
需要一个字符串作为它的第一个参数。您可以使用 perror()
打印如上所示的错误。