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