Existe uma pergunta semelhante em SO . A resposta atualmente aceita por @ephemient sugere o uso de um ioctl
chamado fiemap
, documentado em linux/Documentation/filesystems/fiemap.txt
. Citando esse arquivo:
The fiemap ioctl is an efficient method for userspace to get file extent mappings. Instead of block-by-block mapping (such as bmap), fiemap returns a list of extents.
Parece que esse é o tipo de informação que você está procurando. O suporte por sistemas de arquivos é novamente opcional:
File systems wishing to support fiemap must implement a
->fiemap
callback on theirinode_operations
structure.
Suporte para os argumentos SEEK_DATA
e SEEK_HOLE
para lseek
you mencionado do Solaris foi adicionado no Linux 3.1 de acordo com a página man , então você pode usar isso também. O fiemap ioctl
parece ser mais antigo, por isso pode ser mais portátil em diferentes versões do Linux, enquanto o lseek
pode ser mais portátil em sistemas operacionais se o Solaris tiver o mesmo.