ioctl 失败:不允许操作 - 我的文件的块布局

Posted

技术标签:

【中文标题】ioctl 失败:不允许操作 - 我的文件的块布局【英文标题】:ioctl failed: Operation not permitted - block layout of my files 【发布时间】:2016-05-23 23:08:15 【问题描述】:

我想在块级别查看文件的内容。 给定一个文件,我想知道它有多少块,每个块的大小是多少。

我的问题是当我运行它时出现这个错误:

FIBMAP ioctl failed: Operation not permitted

另外,当我编译时,我会收到以下警告:

warning: implicit declaration of function ‘ioctl’ [-Wimplicit-function-declaration]
  if (ioctl(fd, FIGETBSZ, &blocksize)) 

我正在使用以下代码。

代码:

#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>
#include <fcntl.h>
#include <linux/fs.h>
#include <assert.h>
#include <linux/fs.h>



int main(int argc, char **argv)


    int fd, i, block, blocksize, blkcnt;
    struct stat st;

    assert(argv[1] != NULL);

    fd = open(argv[1], O_RDONLY);
    if (fd <= 0) 
        perror("error opening file");
        exit(EXIT_FAILURE);
    

    if (ioctl(fd, FIGETBSZ, &blocksize)) 
        perror("FIBMAP ioctl failed");
        exit(EXIT_FAILURE);
    

    if (fstat(fd, &st)) 
        perror("fstat error");
        exit(EXIT_FAILURE);
    

    blkcnt = (st.st_size + blocksize - 1) / blocksize;

    for (i = 0; i < blkcnt; i++) 
        block = i;
        if (ioctl(fd, FIBMAP, &block)) 
            perror("FIBMAP ioctl failed");
        
        printf("%3d %10d\n", i, block);
    

    close(fd);
    return 0;

谁能解释一下这段代码有什么问题。

【问题讨论】:

你检查过ioctlman page 是的,我还检查了说明使用 O_NONBLOCK 标志的说明。我用过但结果是一样的 FIGETBSZ 是唯一直接调用put_user()(即从内核空间复制缓冲区)的ioctl 虚拟文件系统案例(内核代码中的do_vfs_ioctl)。邮件列表上关于“FIGETBSZ ioctl 冲突”的讨论无休无止,但我不记得是否有解决方案。首先,我会尝试确保仅在常规文件上调用它(S_ISREG)。除此之外,请尝试不同的内核版本。 包括 &lt;sys/ioctl.h&gt; 以消除该警告。 【参考方案1】:

您应该以 root 身份运行该程序。

ioctl(FIBMAP) 需要 CAP_SYS_RAWIO capability。

【讨论】:

迟到总比不到好。谢谢! @photeesh LOL,我没有注意到日期。无论如何,我会留下答案。也许其他人也遇到了同样的问题。

以上是关于ioctl 失败:不允许操作 - 我的文件的块布局的主要内容,如果未能解决你的问题,请参考以下文章

尝试将参数传递给 ioctl 调用将参数归零

在 Jenkins 下运行时,maven-gpg-plugin 失败并显示“设备的 ioctl 不合适”

上传文件时操作不允许错误 DJango

E/libprocessgroup:set_timerslack_ns 写入失败:不允许操作?

为啥有些 ioctl 案例总是失败?

获取 D-Bus 连接失败:不允许操作