当传入(char*)而不是(char*const)时,execv()不起作用
我有一个类似blow的程序:当传入(char*)而不是(char*const)时,execv()不起作用,c,C,我有一个类似blow的程序: int main() { char * const args[2]={"a", "b",}; int pid = fork(); if ( pid == 0 ) { execv("./printargs", args); } return 0; } 当我从终端运行它时。execv()执行printargs并打印agrs[]的所有值。所以程序运行正常 但当我稍微更改程序以获取输入并重新编写程序时,如下所示: int main(
int main()
{
char * const args[2]={"a", "b",};
int pid = fork();
if ( pid == 0 ) {
execv("./printargs", args);
}
return 0;
}
当我从终端运行它时。execv()执行printargs并打印agrs[]的所有值。所以程序运行正常
但当我稍微更改程序以获取输入并重新编写程序时,如下所示:
int main()
{
char * args[2];
args[0] = (char*)malloc(sizeof(char)*10);
args[1] = (char*)malloc(sizeof(char)*10);
scanf("%s", args[0]);
scanf("%s", args[1]);
int pid = fork();
if ( pid == 0 ) {
execv("./printargs", args);
}
return 0;
}
然后execv()不起作用&我不明白问题出在哪里
但我需要通过从输入中获取值来动态传递参数
提前感谢您的帮助。正如我所说,您有以下问题:
需要以NULL结尾的数组作为第二个参数(因此最后一个值必须是NULL值)execv
- 此参数也以“程序名”开头,因此实际的第一个参数(如您所愿)是
,而不是args[1]
args[0]
- 您还应该检查错误和返回值
- 请注意,
意味着%10s
将最多读取10个字符,然后添加一个前导的scanf
,因此可能是11个字符!使用\0
或增加分配大小%9s
/bin/echo
命令而不是/prinargs
):
大多数情况下,最好等待孩子(使用
wait()
family),这样父亲就不会在孩子(ren)之前结束,您也可以获得其返回状态(即,返回您执行的命令,或者如果execv()
失败,则返回您的exit()
值)。什么是“不工作”?发生了什么?读取execv手册页的内容。第二个参数必须是以NULL结尾的列表。不能以NULL值(args[2]=NULL;
并将其声明为char*args[3];
).“return 0”对于父级来说是可以的,但是对于子级来说可能是错误的。如果execv失败并且返回被执行,那么这似乎是失败的。因为在您的情况下execv似乎失败了,也许您应该在execv之后调用peror
,让系统告诉您失败的原因。不要在C中强制转换malloc
&friends的结果!而且sizeof(char)
是无用的/错误的,因为它保证总是产生1
。此外,execv
的主页说明args中的第一个值类似于main的argv[0]
:二进制文件的名称。因此args必须进入args[1]
…我明白了,现在它对我有效,但我面临另一个问题,请改进我的程序。如果您有新问题,请自行搜索,如果您确实找不到解决方案,请询问其他问题。
int main()
{
char * args[4]; // 1 for bin name, 2 for args, 1 for NULL
args[0] = "/bin/echo"; // you may put what you want here, in fact
args[1] = (char*)malloc(sizeof(char)*10);
args[2] = (char*)malloc(sizeof(char)*10);
args[3] = NULL; // NULL-terminated
scanf("%9s", args[1]); // read 9 (+1 for \0)
scanf("%9s", args[2]);
int pid = fork();
if (pid == -1) { // handle fork() error
perror("fork"); // print out the reason
exit(1); // and leave
} else if (pid == 0) {
// child
execv("/bin/echo", args);
perror("execv"); // we are here only if execv failed
exit(1); // so print out error and exit
}
// here you should wait for your child to get returned value
// see wait() and similar functions
return 0;
}