【问题标题】:Not printing Inode File name or header information in C不在 C 中打印 Inode 文件名或标头信息
【发布时间】:2013-01-24 23:43:03
【问题描述】:

运行以下代码行并遇到我不确定的问题。主要思想是让用户输入要搜索的 inode。找到后,将打印与该 inode 关联的文件名,然后对该文件名运行命令“stat”以生成有关该文件的信息。

#define COMMAND_LEN 1024
#define DATA_SIZE 1024

int main(int argc, char **argv) {
    FILE *pf;
    char command[COMMAND_LEN];
    char data[DATA_SIZE];
    char inode_data[DATA_SIZE];
    int iNode;

    printf("Enter inode: ");
    scanf(argv[0], iNode);

    sprintf(command, "find -inum %i -type f", iNode);
    pf = popen(command, "r");

    if(!pf){
        fprintf(stderr, "Could not open pipe for outlet.\n");
        return;
    }

    fgets(data, DATA_SIZE, pf);
    fprintf(stdout, "%s\n", data);

    sprintf(command, "stat %s", data);
    pf = popen(command, "r");
    fgets(inode_data, DATA_SIZE, pf);
    fprintf(stdout, "%s\n", inode_data);

    if (pclose(pf) != 0)
        fprintf(stderr, "Error: Failed to close command stream!\n");

    Return 0;
}

编译、运行并输入一个 inode 编号后,我会得到以下信息:

Enter inode: 148869

stat: missing operand
Try 'stat --help' for more information.

Error: Failed to close command stream!

收到了来自旧问题帖子Save information from sprintf to a variable的有用帮助

【问题讨论】:

  • stat 实用程序的目的是让您可以从 shell 访问 stat 系统调用。由于您使用 C 编写代码,因此只需调用 stat 而不是生成一个 shell 来为您调用它会更有意义。 man 2 stat

标签: c project printf inode


【解决方案1】:

除非您在命令行参数中传递了格式字符串,否则不应将scanfargv[0] 参数一起使用。另外,scanf 应该传递一个 int* 作为第二个参数,所以它应该是 scanf("%d", &iNode);

【讨论】:

    【解决方案2】:

    如果您阅读find manual page,您会发现它需要一个路径 从何处进行搜索。你的find 命令行中没有。

    您也没有正确读取用户的输入。 argv[0] 是您的程序的名称。您应该传递一个正确的格式字符串,例如

    scanf("%s", iNode);
    

    如果您使用了调试器,或者甚至在scanf 之后打印了输入,您应该很快就看到了。

    【讨论】:

    • 我原来用的是sprintf(command, "find / -inum %i -type f", iNode);之前,但搜索游戏我的文件和靠近 inode 的目录中的任何其他内容。
    • @seiryuu10 您是否安装了多个磁盘?请记住,inode 编号仅对单个文件系统是唯一的。多个文件系统可能具有相同 inode 编号的文件。
    • 我在虚拟机中运行这个项目。因此,它只是访问 VM 内的目录。
    • @seiryuu10 那可能是你没有正确读取用户的输入。
    猜你喜欢
    • 2014-04-29
    • 2023-01-11
    • 2019-07-15
    • 2013-01-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-05-04
    • 1970-01-01
    相关资源
    最近更新 更多