execve()返回任何命令的错误
作为一个学校项目,我必须制作一个定制的外壳,我用这个来碰壁:execve()返回任何命令的错误,c,linux,exec,C,Linux,Exec,作为一个学校项目,我必须制作一个定制的外壳,我用这个来碰壁: 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
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]
步骤:1
/* myecho.c */
#include <stdio.h>
#include <stdlib.h>
int
main(int argc, char *argv[])
{
int j;
for (j = 0; j < argc; j++)
printf("argv[%d]: %s\n", j, argv[j]);
exit(EXIT_SUCCESS);
}
/*myecho.c*/
#包括
#包括
int
main(int argc,char*argv[])
{
int j;
对于(j=0;j
编译程序:gcc myecho.c-o myecho
步骤:2
/* execve.c */
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
int
main(int argc, char *argv[])
{
char *newargv[] = { NULL, "hello", "world", NULL };
char *newenviron[] = { NULL };
if (argc != 2) {
fprintf(stderr, "Usage: %s <file-to-exec>\n", argv[0]);
exit(EXIT_FAILURE);
}
newargv[0] = argv[1];
if (execve(argv[1], newargv , newenviron) == -1) //if an error occurs
{
printf("Commande invalide : %s\n", argv[0]);
fflush(stdout);//vide le buffer
exit(0);
return -1;
}
}
/*execve.c*/
#包括
#包括
#包括
int
main(int argc,char*argv[])
{
char*newargv[]={NULL,“你好”,“世界”,NULL};
char*newenviron[]={NULL};
如果(argc!=2){
fprintf(stderr,“用法:%s\n”,argv[0]);
退出(退出失败);
}
newargv[0]=argv[1];
if(execve(argv[1],newargv,newenviron)=-1)//如果发生错误
{
printf(“命令无效:%s\n”,argv[0]);
fflush(stdout);//提供缓冲区
出口(0);
返回-1;
}
}
编译程序:gcc execve.c-o execve
步骤:3//最后呼叫
./execve./myecho
步骤:观察输出。要传递空环境,请定义并传递
char * env[] = { NULL };
作为execve()
的第三个参数,如下所示
execve(argv[0], argv, env)
或者通过执行以下操作来使用复合文字
execve(argv[0], argv, (char*[]){NULL})
另外,exec*()
函数系列的成员只会返回错误,因此周围的代码可能如下所示:
int main(void)
{
...
execve(argv[0], argv, (char*[]){NULL});
perror("execve() failed");
return EXIT_FAILURE; /* include stdlib.h to have this macro available */
}
[决心]嘿,谢谢大家的回答。它帮助我更好地找出了问题所在,我找到了答案。
主要问题是路径不正确。代码的第25行是什么?这就是警告的来源。
(char**)
强制转换对于char**argv
参数来说毫无意义。不要使用不必要的强制转换。argv[0]中有什么内容?您不应该传递空指针作为环境参数。进程有权使用最小环境—您应该向空列表传递有效指针,而不是空指针(char*empty[]={0};
并传递empty
,以代替null
)。如果在调用printf()
之前选中了errno
(或使用了peror()
),则希望将EINVAL
或无效参数
作为错误条件。此外,错误通常应该在stderr
上报告,而不是在stdout
上报告。请阅读本规范了解execve api。下面是我用<代码> ExcVPU.()<代码>写的一个例子:你确定你在使用C编译器,不知为什么这个警告闻起来像C++。根据你的建议,它被修改了。谢谢