首页 文章

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

提问于
浏览
0

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

  • 5

    您的代码中存在一个大问题: execv 可以't tell how big the array you'重新传递它 . 你绝对需要一个终止 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);
    

相关问题