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

时间:2018-12-08 21:05:19

标签: c linux wildcard

我正在尝试使用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

1 个答案:

答案 0 :(得分:5)

您的代码中存在一个大问题: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);