我对系统调用execve的使用感到困惑。第二个参数应该是指向参数的指针,但是它不能工作,但是当我将整个命令(/bin/bash)+ arg作为第二个参数发送时,它确实正确地执行。
./test /bin/bash "echo 'this is a test' | wc -c"
#include <unistd.h>
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <ctype.h>
int main(int argc, char *argv[]) {
execve(argv[1], &argv[1], NULL); ////works, but I dont understand how since the 2nd param is wrong.
return 0;
}
int main(int argc, char *argv[]) {
execve(argv[1], &argv[2], NULL); ////doenst work, it should since Im sending the correct aguments.
printf("hi");
return 0;
}发布于 2022-06-06 05:49:37
argv是一个指向作为命令行参数传递给新程序的字符串的指针数组。按照惯例,这些字符串中的第一个字符串(即argv[0]**) )应该包含与正在执行的文件相关联的文件名**。argv数组必须由NULL指针终止。(因此,在新程序中,argv[argc]将是NULL。)
换句话说,在第二个参数中传递的参数列表包括可执行文件本身的名称(尽管在第一个参数中已经指定了它)。这就是可执行文件如何检测它们是如何被调用的(例如通过符号链接),并在它们的“帮助”输出中显示正确的名称。
发布于 2022-06-06 06:02:49
argv[0]包含正在执行的文件的名称。因此,execve还需要将文件作为第一个元素执行(索引0)。
发布于 2022-06-06 05:50:00
在“执行者”中我们可以看到它的原型是:
int execve(const char *pathname, char *const argv[], char *const envp[]);根据execve man (https://man7.org/linux/man-pages/man2/execve.2.html)
argv是一个指向作为命令行参数传递给新程序的字符串的指针数组。按照惯例,这些字符串中的第一个(即argv) 应该包含与正在执行的文件相关联的文件名。argv数组必须由空指针终止。(因此,在新程序中,argvargc将为空。)
关于这些规则,您的代码应该是:
#include <stdio.h>
#include <unistd.h>
int main ()
{
char *filepath = "/bin/echo";
char *argv[] = { filepath, "Hello World", NULL };
execve (filepath, argv, NULL);
return 0;
}https://stackoverflow.com/questions/72513285
复制相似问题