在下面的代码中,我试图执行一个现有的python文件( python文件很好),同时使用execvp传递一个参数。因为某种原因我不能。还值得一提的是,我正在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);发布于 2018-12-20 11:09:49
char** const args[] = {argv};创建变量,该变量是指向指向字符指针的变量的数组。数组有一个元素,即。它存储指向指向字符类型的指针的一个元素。这一个元素具有argv指针的值,即。&argv[0] (而不是argv[0])的值。args是一个变量数组,它指向指向字符类型的指针。args不是“argv引用的所有内存的副本”。args是一个单一元素数组。
args在大多数上下文中,类型数组会衰减为类型指针。因此,args衰减为指向字符的指针,即。is具有char ***类型。请注意,值为args == &args和args != &argv。args数组的地址不等于argv。
使用不兼容的参数调用execvp是未定义的行为,因此任何事情都可能发生。启用编译器警告并每次修复它们,以便在程序中不会发生未定义的行为。
您想要的是创建argv数组中所有指针值的副本。您还需要一个空终止符的空间。因此,首先为argv数组中所有指针的值分配内存,argc计数指针指向字符串。然后复制argv数组中指针的值。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);https://stackoverflow.com/questions/53866398
复制相似问题