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

时间:2016-05-23 23:08:15

标签: c linux unix ioctl

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

我的问题是,当我运行它时,我收到此错误:

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;
}

任何人都可以解释一下这段代码中的问题。

1 个答案:

答案 0 :(得分:1)

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

ioctl(FIBMAP)需要CAP_SYS_RAWIO capability