2017-06-20 63 views
0

我必须做出一个自定义的外壳作为一所学校的项目和我打这个墙返回错误:的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串]

+2

什么是你的代码的第25行?这是警告来自的地方。 – FKEinternet

+1

考虑到'char ** argv'参数,'(char **)'强制转换是毫无意义的。不要使用不必要的演员。 'argv [0]'中有什么?你不应该传递一个空指针作为环境参数。进程被授予最小的环境 - 并且你应该传递一个有效的指针给一个空的列表而不是空指针('char * empty [] = {0};'并且通过'empty'来代替'NULL')。如果你在调用'printf()'之前检查过'errno'(或者使用'perror()'),你会看到'EINVAL'或'Invalid argument'作为错误条件。另外,错误通常应该在'stderr'上报告,而不是'stdout'。 –

+0

请阅读execve api的这个规范。 HTTPS://linux.die。net/man/2/execve –

回答

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

步骤:观察输出。

+0

'perror()'永远不会被调用。 – alk

+0

你说得对。根据你的建议修改。谢谢。 –

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

【解析】嘿,我要感谢大家的答案。它帮助我更好地弄清楚什么是错误的,并且我找到了答案here。 主要问题是路径不正确。