我必须将自定义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]
答案 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。 主要问题是道路不正确。