我想在Linux机器上使用ls -a
执行命令execv()
,如下所示:
char *const ptr={"/bin/sh","-c","ls","-a" ,NULL};
execv("/bin/sh",ptr);
但是,此命令不会列出隐藏文件。我做错了什么?
答案 0 :(得分:9)
我不确定你为什么通过/bin/sh
传递这个...但是因为你是,你需要将-c
之后的所有参数作为单个值传递,因为这些现在是由/bin/sh
解释。
示例是比较
的shell语法/bin/sh -c ls -a
到
/bin/sh -c 'ls -a'
第二个有效,但第一个没有。
因此,您的ptr
应定义为
char * const ptr[]={"/bin/sh","-c","ls -a" ,NULL};
答案 1 :(得分:5)
如果你需要从c程序获取目录的内容,那么这不是最好的方法 - 你将有效地解析ls
的输出,{{3 }}
相反,您可以使用libc
函数generally considered a bad idea和opendir()
来实现此目标。
这是一个小例子程序,它将迭代(并列出)当前目录中的所有文件:
#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
#include <dirent.h>
int main (int argc, char **argv) {
DIR *dirp;
struct dirent *dp;
dirp = opendir(".");
if (!dirp) {
perror("opendir()");
exit(1);
}
while ((dp = readdir(dirp))) {
puts(dp->d_name);
}
if (errno) {
perror("readdir()");
exit(1);
}
return 0;
}
请注意,与默认的ls -a
输出不同,列表不会被排序。