将可选参数传递给 C execlp()
Issue passing optional parameters into C execlp()
我正在编写一个 C 程序,该程序使用 execlp()
到 运行 linux 命令行工具 convert
。此命令采用可选参数。但是,当它与 execlp()
一起使用时,我的 C 程序无法识别我传入的标志,因此无法正确执行命令。
例如,如果我要 运行 在终端 convert -resize 10% src.jpg dst.jpg
中执行此命令,它会将 src 图像的大小调整 10%,并将其保存到 dst。但是,当我 运行 我的 C 程序使用此代码时
rc = execlp("convert", "-resize 10%", src, dst, NULL);
我的计算机无法识别 resize -10%
标志,并且不会对我的源图像执行任何操作。这是为什么?
最有可能的是,-resize
应该是一个选项,10%
应该是另一个选项:
rc = execlp("convert", "convert", "-resize", "10%", src, dst, NULL);
如果你有可变数量的参数,使用 execlp()
是一个坏主意 — 请改用 execvp()
,构建一个由空指针终止的参数数组。仅当参数列表固定时才使用 execlp()
。
char *args[6];
int i = 0;
args[i++] = "convert";
args[i++] = "-resize";
args[i++] = "10%";
args[i++] = src;
args[i++] = dst;
args[i++] = NULL;
rc = execvp(args[0], args);
请注意,此公式可确保正确传递程序名称 — 一次作为在 $PATH
上搜索的字符串,一次作为已执行程序的 argv[0]
。
与 execlp()
和 dbush 一样,您必须重复命令名称 — 一次指定可执行文件,一次指定 argv[0]
的值。
还要注意,没有什么可以阻止您通过 argv[0]
告诉程序它的名称与您执行的名称完全不同。这种情况很少发生(shell 不会这样做)但是当您自己编写代码时,这是可能的。
按照惯例,进程的第一个参数(可访问为 argv[0]
)是进程的名称。您没有包含它,因此 "-resize 10%"
被读取为进程名称而不是选项。
另外,"-resize 10%"
实际上是两个参数,中间用space隔开,所以需要拆分。
rc = execlp("convert", "convert", "-resize", "10%", src, dst, NULL);
我正在编写一个 C 程序,该程序使用 execlp()
到 运行 linux 命令行工具 convert
。此命令采用可选参数。但是,当它与 execlp()
一起使用时,我的 C 程序无法识别我传入的标志,因此无法正确执行命令。
例如,如果我要 运行 在终端 convert -resize 10% src.jpg dst.jpg
中执行此命令,它会将 src 图像的大小调整 10%,并将其保存到 dst。但是,当我 运行 我的 C 程序使用此代码时
rc = execlp("convert", "-resize 10%", src, dst, NULL);
我的计算机无法识别 resize -10%
标志,并且不会对我的源图像执行任何操作。这是为什么?
最有可能的是,-resize
应该是一个选项,10%
应该是另一个选项:
rc = execlp("convert", "convert", "-resize", "10%", src, dst, NULL);
如果你有可变数量的参数,使用 execlp()
是一个坏主意 — 请改用 execvp()
,构建一个由空指针终止的参数数组。仅当参数列表固定时才使用 execlp()
。
char *args[6];
int i = 0;
args[i++] = "convert";
args[i++] = "-resize";
args[i++] = "10%";
args[i++] = src;
args[i++] = dst;
args[i++] = NULL;
rc = execvp(args[0], args);
请注意,此公式可确保正确传递程序名称 — 一次作为在 $PATH
上搜索的字符串,一次作为已执行程序的 argv[0]
。
与 execlp()
和 dbush argv[0]
的值。
还要注意,没有什么可以阻止您通过 argv[0]
告诉程序它的名称与您执行的名称完全不同。这种情况很少发生(shell 不会这样做)但是当您自己编写代码时,这是可能的。
按照惯例,进程的第一个参数(可访问为 argv[0]
)是进程的名称。您没有包含它,因此 "-resize 10%"
被读取为进程名称而不是选项。
另外,"-resize 10%"
实际上是两个参数,中间用space隔开,所以需要拆分。
rc = execlp("convert", "convert", "-resize", "10%", src, dst, NULL);