在下面的代码中,我试图使用execvp在传递参数的同时执行现有的python文件(该python文件很好)。由于某种原因,我无法。另外值得一提的是,我正在macOSX上运行它。
我从终端这样传递参数:
#./run testArg
我已经尝试过
execlp("python3", "python3", "./test.py", NULL);
execlp("python3", "python3", "./test.py", args);
execlp("python3", "python3", "./test.py", argv);
s.t args
是:
char** const args[] = {argv}
;
最上面的一个有效(但显然没有论据),最下面的两个无效。
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/wait.h>
#include <sys/types.h>
#include <Python/Python.h>
int main(int argc, char* argv[])
{
char** const args[] = {argv};
execvp("./test.py", args);
答案 0 :(得分:1)
char** const args[] = {argv};
创建变量,该变量是变量的数组,其类型是指向字符的指针。该数组具有 one 元素,即。它存储一个指向字符类型的指针的指针元素。这个元素具有argv指针的 value ,即。 &argv[0]
的值(不是argv[0]
)。 args
是一个变量数组,具有指向字符类型的指针。 args
不是“ argv引用的所有内存的副本”。 args
是一个单元素数组。
args
在大多数情况下,类型数组会衰减为类型指针。因此args
衰减到指向字符的指针,即指向字符的指针。具有char ***
类型。请注意,值为args == &args
和args != &argv
。 args
数组的地址不等于argv
。
使用不兼容的参数调用execvp
是未定义的行为,因此任何事情都可能发生。启用编译器警告并每次对其进行修复,以使程序中不会发生未定义的行为。
您想要的是在argv
数组中创建指针的所有值的副本。您还需要一个用于NULL终止符的空间。因此,首先为argv
计数字符串指针的argc
数组内的所有指针的 values 分配内存。然后在argv
数组内复制指针的 values 。 NULL终止数组。然后致电execvp
。
// allocate space
char **args = calloc(sizeof(char*), argc + 1);
// copy pointers
for (size_t i = 0; i < argc; ++i) {
args[i] = argv[i];
}
// alternatively copy values using memcpy
memcpy(args, argv, sizeof(char*) * argc);
// null terminate
args[argc] = NULL;
execvp("./test.py", args);
// and always remember to pick up the trash
free(args);