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。
主要问题是路径不正确。
我必须定制一个 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。 主要问题是路径不正确。