我正在尝试使用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
答案 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);