我必须做出一个自定义的外壳作为一所学校的项目和我打这个墙返回错误:的execve()的任何命令
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:警告:从字符串常量 '字符*' 弃用转换[-Wwrite串]
什么是你的代码的第25行?这是警告来自的地方。 – FKEinternet
考虑到'char ** argv'参数,'(char **)'强制转换是毫无意义的。不要使用不必要的演员。 'argv [0]'中有什么?你不应该传递一个空指针作为环境参数。进程被授予最小的环境 - 并且你应该传递一个有效的指针给一个空的列表而不是空指针('char * empty [] = {0};'并且通过'empty'来代替'NULL')。如果你在调用'printf()'之前检查过'errno'(或者使用'perror()'),你会看到'EINVAL'或'Invalid argument'作为错误条件。另外,错误通常应该在'stderr'上报告,而不是'stdout'。 –
请阅读execve api的这个规范。 HTTPS://linux.die。net/man/2/execve –