如何使用 execv() 在 ls 中传递额外选项?

How to pass an extra option in ls using execv()?

我正在尝试使用 execv() 函数执行这个简单的命令 ls -1 *.c

#include<stdio.h>
#include<fcntl.h>
int main(int argc,char* argv[]){
char *arr[3]={"ls","-1","*.c"};
execv("/bin/ls",arr);
}

我得到的输出是

ls: cannot access *.c: No such file or directory

您的代码中存在一个大问题:execv 无法判断您传递的数组有多大。您绝对需要一个终止 NULL 元素来标记结束:

char *arr[] = { "ls", "-1", "*.c", NULL };

好的,现在我们有一个有效的 execv 调用,我们可以处理 ls 错误。

像这样调用execv相当于运行

'ls' '-1' '*.c'

在命令行上(会产生同样的错误)。

当你这样做时

ls -1 *.c

在命令行上,ls 永远不会看到 *.c,因为 shell 扩展通配符并将匹配文件名列表传递给 ls

如果你想在你的 C 代码中复制它,你必须手动做同样的事情。参见例如man glob 用于完成大部分工作的函数。这是手册页中的一个改编示例,显示了一般原则:

glob_t globbuf;

globbuf.gl_offs = 2;
glob("*.c", GLOB_DOOFFS, NULL, &globbuf);
globbuf.gl_pathv[0] = "ls";
globbuf.gl_pathv[1] = "-1";
execv("/bin/ls", globbuf.gl_pathv);