execve() 返回任何命令的错误

execve() returning error for any command

我必须定制一个 shell 作为学校项目,但我遇到了困难:

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 调用该命令。 但是,它总是 returns 一个错误。

我做错了什么?

这是一条警告:

primitives.c:25:30: warning: deprecated conversion from string constant to ‘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);
}

编译程序: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;
    }
}

编译程序:gcc execve.c -o execve

step: 3 //最终调用

./execve ./myecho

步骤:观察输出。

要传递空环境,请定义并传递

char * env[] = { NULL };

作为 execve() 的第三个参数,像这样

execve(argv[0], argv, env)

或通过

使用复合文字
execve(argv[0], argv, (char*[]){NULL})

还有exec*()函数族的成员只有return才会出错,所以周围代码可能如下所示:

int main(void)
{

  ...

  execve(argv[0], argv, (char*[]){NULL});
  perror("execve() failed");

  return EXIT_FAILURE; /* include stdlib.h to have this macro available */
}

[已解决]嘿,非常感谢大家的回答。它帮助我更好地找出问题所在,并找到了答案 here。 主要问题是路径不正确。