提问人:AlCo2 提问时间:11/8/2023 更新时间:11/9/2023 访问量:80
将 execve 与命令和 2 个参数一起使用
using execve with command and 2 arguments
问:
我正在创建自己的 shell,在此函数中传递带有 2 参数的命令时遇到问题:
void executeCMD(char **av)
{
int status;
pid_t pid;
pid = fork();
if (pid == -1)
{
perror("error");
exit(1);
}
if (pid == 0)
{
if (execve(av[0], av, NULL) == -1)
{
perror("Error");
exit(1);
}
}
else
{
wait(&status);
}
}
如果我传递了类似的东西:/bin/ls 或 /bin/ls -l,它工作正常,但使用类似的东西:
/bin/ls -l /tmp
我明白了:
$ ls -l /tmp
Error: Bad address
问题出在所有命令中,特别是当我添加第三个参数时。
我如何创建命令,将缓冲区作为命令和参数传递给 **av:
char **split_string(char *input, char *delim)
{
char **list = NULL;
int i = 0;
char* token = strtok(input, delim);
while (token != NULL)
{
list = realloc(list, (i + 1) * sizeof(char *));
if (list == NULL)
{
perror("out of memory");
exit(1);
}
list[i] = realloc(list[i], strlen(token) + 1);
if (list[i] == NULL)
{
perror("out of memory");
exit(1);
}
strcpy(list[i], strdup(token));
token = strtok(NULL, delim);
i++;
}
return (list);
}
答:
0赞
Nick Brendholdt Rasmussen
11/9/2023
#1
我认为您也为 argv 提供了路径 av[0]。也许可以尝试: execve(av[0], av+1, NULL)。
并确保 av 以 null 结尾
评论
0赞
user1934428
11/9/2023
但是参数 0 应该是程序名称(或者我们希望被调用程序相信它的程序名称是什么)。 对我来说没有意义。av+1
0赞
Nick Brendholdt Rasmussen
11/10/2023
av + 1 只是从第一个标志“-i”开始数组并向前。所以“av + 1”作为“-i”和“/tmp”存在的数组,可能在数组末尾有“0”
0赞
user1934428
11/10/2023
根据 execve-man 页面,第二个参数是被调用程序将在其 .但按照惯例,(即)的第一个参数应该是所谓的程序调用名称。如果传递 ,main's 将包含标志,而不是程序名称。execve
main
argv
argv
argv[0]
av +1
argv[0]
0赞
Nick Brendholdt Rasmussen
11/10/2023
execve(av[0], av+1, NULL)。第一个参数是 /ls,exec 的第二个参数是不包括 /ls 的数组,不是吗?
0赞
user1934428
11/10/2023
不。 是正在执行的程序。第二个参数的第一个元素是我们想让程序相信它被执行的东西。例如,如果您执行并让第二个参数 be ,则 sh 运行,但认为它的名称是 。这将产生 shell 充当登录 shell 的效果。av[0]
/bin/sh foo
['-sh', 'foo']
-sh
评论
strdup()
execve()
list[i]
realloc()
realloc()
malloc()
list[i] = strdup(token);
execve()
char *
malloc()
strcpy()
strdup()
envp
execve()
envp
envp
envp
NULL
execv()