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++。根据你的建议,它被修改了。谢谢