【发布时间】:2017-06-20 03:34:07
【问题描述】:
我必须制作一个自定义外壳作为学校项目,但我遇到了这个问题:
int exec_shell(char **argv) //
{
if (execve(argv[0], (char **)argv , NULL)==-1) //if an error occurs
{
printf("Commande invalide : %s\n", argv[0]);
fflush(stdout);//vide le buffer
exit(0);
return -1;
}
return 0;
}
这应该很简单——你以字符串形式输入一个命令,然后 exec 调用该命令。 但是,它总是返回错误。
我做错了什么?
这是一个警告:
primitives.c:25:30: 警告:不推荐将字符串常量转换为‘char*’ [-Wwrite-strings]
【问题讨论】:
-
代码的第 25 行是什么?这就是警告的来源。
-
鉴于
char **argv参数,(char **)演员表毫无意义。不要使用不必要的演员表。argv[0]中有什么内容?您不应该将空指针作为环境参数传递。进程有权使用最小环境 - 您应该将有效指针传递给空列表而不是空指针(char *empty[] = { 0 };并传递empty代替NULL)。如果您检查了errno(或在调用printf()之前使用了perror()),您希望看到EINVAL或Invalid argument作为错误条件。此外,错误通常应该报告在stderr,而不是stdout。 -
请阅读本规范以获取 execve api。 linux.die.net/man/2/execve
-
这是我使用
execvp()写的一个例子:stackoverflow.com/a/42973015/900078 -
你确定你使用的是 C 编译器吗,不知何故这个警告闻起来像 C++。