将可选参数传递给 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);