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

时间:2017-06-20 03:34:07

标签: c linux exec

我必须将自定义shell作为一个学校项目,我正在用这个:#/ p>

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]

3 个答案:

答案 0 :(得分:0)

步骤: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

步骤:3 //最后通话

./ execve ./myecho

步骤:观察输出。

答案 1 :(得分:0)

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

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 */
}

答案 2 :(得分:0)

[已解决]嘿,我想感谢大家的回答。它帮助我弄清楚错误是什么,我找到了答案here。 主要问题是道路不正确。