从C程序运行find来打印给定inode号的文件名?

时间:2017-11-17 21:52:34

标签: c

我正在尝试在给定inode编号的情况下打印文件名。我正在使用execlp系统调用来运行find命令。我的代码如下所示:

 #include <sys/mman.h>
 #include <sys/stat.h>
 #include <fcntl.h>
 #include <stdio.h>
 #include <stdlib.h>
 #include <stdio.h>
 #include <stdlib.h>
 #include <unistd.h>

 int main(int argc,char *argv[])
 {
    char str[8];
    char *ptr;
    ptr=str;
    long x=9306140;
    snprintf(str,8,"%ld", x);
    execlp("find"," ","~"," ","-inum"," ",str,NULL);

 }

但是我收到一个错误:无效的参数&#39; 9306140&#39;到-inum。 有人可以帮忙吗?

1 个答案:

答案 0 :(得分:2)

如评论中所述,您不希望" "参数列表中包含execlp()(空格)参数。 shell接受一个带有分隔参数的空格的字符串,但它将空格之间的内容视为传递给命令的单词;它通常不会将空格传递给命令。 (对于这个练习来说,这是一个简单而充分的解释;可以添加一些警告和狡猾的单词。)

shell还会扩展~以匹配$HOME环境变量中的值(与~user相比,后者从密码文件中获取user的主目录 - 他们通常但不一定相同。

您为该号码分配的字符串大小的误差也很小。坦率地说,你应该只使用一个字符串。所有这些变化导致:

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>

int main(void)
{
    const char *home = getenv("HOME");
    const char inode[] = "9306140";
    execlp("find", "find", home, "-inum", inode, (char *)NULL);
    fprintf(stderr, "failed to execute 'find' command\n");
    return(EXIT_FAILURE);
}

注意重复的"find";第一个是沿路径搜索后要执行的文件的名称;第二个是作为argv[0]提供的值。您可以将"hypochondriac"作为第二次出现,find可能会相同,最坏的情况是报告其错误消息来自程序&#39; hypochondriac&#39 ;

下一步是从命令行参数中获取inode编号:

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>

int main(int argc, char **argv)
{
    if (argc != 2)
    {
         fprintf(stderr, "Usage: %s inode\n", argv[0]);
         exit(EXIT_FAILURE);
    }
    const char *home = getenv("HOME");
    const char *inode = argv[1];
    execlp("find", "find", home, "-inum", inode, (char *)NULL);
    fprintf(stderr, "%s: failed to execute 'find' command\n", argv[0]);
    return(EXIT_FAILURE);
}

之后的步骤是处理多个inode值;此时,您使用的是execvp()而不是execlp()(或者,如果您是绝望和懒惰,则每个inode循环一次fork()execlp()数字,但这根本没有任何理由抨击你的系统。)