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;
谁能解释一下这段代码有什么问题。
【问题讨论】:
你检查过ioctl
man page
是的,我还检查了说明使用 O_NONBLOCK 标志的说明。我用过但结果是一样的
FIGETBSZ
是唯一直接调用put_user()
(即从内核空间复制缓冲区)的ioctl 虚拟文件系统案例(内核代码中的do_vfs_ioctl
)。邮件列表上关于“FIGETBSZ ioctl 冲突”的讨论无休无止,但我不记得是否有解决方案。首先,我会尝试确保仅在常规文件上调用它(S_ISREG
)。除此之外,请尝试不同的内核版本。
包括 <sys/ioctl.h>
以消除该警告。
【参考方案1】:
您应该以 root 身份运行该程序。
ioctl(FIBMAP)
需要 CAP_SYS_RAWIO
capability。
【讨论】:
迟到总比不到好。谢谢! @photeesh LOL,我没有注意到日期。无论如何,我会留下答案。也许其他人也遇到了同样的问题。以上是关于ioctl 失败:不允许操作 - 我的文件的块布局的主要内容,如果未能解决你的问题,请参考以下文章
在 Jenkins 下运行时,maven-gpg-plugin 失败并显示“设备的 ioctl 不合适”