我正在尝试使用execv()函数执行这个简单的命令 ls -1 *.c .
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 可以't tell how big the array you'重新传递它 . 你绝对需要一个终止 NULL 元素来标记结尾:
execv
NULL
char *arr[] = { "ls", "-1", "*.c", NULL };
好的,既然我们有一个有效的 execv 调用,我们可以处理 ls 错误 .
ls
像这样调用 execv 等同于运行
'ls' '-1' '*.c'
在命令行上(会产生相同的错误) .
当你这样做
在命令行上, ls 永远不会看到 *.c ,因为shell会扩展通配符并将匹配的文件名列表传递给 ls .
*.c
如果要在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);
1 回答
您的代码中存在一个大问题:
execv
可以't tell how big the array you'重新传递它 . 你绝对需要一个终止NULL
元素来标记结尾:好的,既然我们有一个有效的
execv
调用,我们可以处理ls
错误 .像这样调用
execv
等同于运行在命令行上(会产生相同的错误) .
当你这样做
在命令行上,
ls
永远不会看到*.c
,因为shell会扩展通配符并将匹配的文件名列表传递给ls
.如果要在C代码中复制它,则必须手动执行相同的操作 . 参见例如man glob用于执行大部分工作的函数 . 以下是手册页中的一个改编示例,其中显示了一般原则: