我会尝试解释我的问题。如果我执行以下命令
find ~ -name file.txt
在Linux中,所有名为file.txt
的文件都将显示在控制台屏幕上。我想创建一个C程序,它将执行相同的操作,使用execlp
函数查找具有特定名称的所有文件,如file.txt
。
如果我这样做:
execlp("find","find","-name","file.txt",NULL);
它编译得很好,但在执行时它只显示名称为file.txt
的文件,该文件位于当前工作目录中。
如果我在我的程序中做了类似的事情:
execlp("find","find","~","-name","file.txt");
它编译得很好,但在执行时它给了我以下错误:
find: `~': No such file or directory.
我应该为execlp
函数提供哪些参数来搜索所有可用目录中的file.txt
?我需要使用execlp
函数执行此操作。
非常感谢你!
答案 0 :(得分:1)
第一个示例中的“〜”由shell扩展,而不是内核。在C中执行命令时,您不会通过shell,因此您不能指望为您进行这种替换。好吧,除非您实际调用shell并要求它运行您的命令,如execlp("/bin/sh", "/bin/sh", "-c", "find", "~", ...);
中所示。
执行您正在执行的操作的首选方法是检查HOME环境变量,或从密码数据库获取当前用户的主目录。这是怎么做的。
#include <unistd.h>
#include <sys/types.h>
#include <pwd.h>
#include <stdlib.h>
const char *homedir = getenv("HOME");
if (homedir == NULL) {
struct passwd *pw = getpwuid(getuid());
homedir = pw->pw_dir;
}
然后只需用homedir变量替换代码中的“〜”参数。