Bloqueie as informações do dispositivo sem montar no Linux
-
29-10-2019 - |
Pergunta
Estou tentando obter algumas informações (especificamente o tamanho do bloco) do dispositivo de bloco no linux, em C ++.É possível obter o tamanho do bloco de um dispositivo sem montá-lo e possivelmente sem olhar os arquivos dinâmicos (como aqueles em /sys
), mas apenas com uma chamada de sistema.
Eu estava tentando com stat
, mas ele retorna dados sobre o sistema de arquivos /dev
se eu perguntar sobre /dev/sdb2
.
Se for impossível com a chamada do sistema, onde devo procurar nos arquivos dinâmicos (também não fui capaz de localizá-lo).
Solução
Você deseja usar ioctl
, em particular BLKSSZGET
.
Citando linux / fs.h:
#define BLKSSZGET _IO(0x12,104)/* get block device sector size */
Exemplo não testado:
#include <sys/ioctl.h>
#include <linux/fs.h>
int fd = open("/dev/sda");
size_t blockSize;
int rc = ioctl(fd, BLKSSZGET, &blockSize);
Outras dicas
Acho que o valor ioctl
deve ser unsigned long
do que size_t
(o mais recente está mais relacionado à memória), eu também o inicializaria com 0 (apenas no caso de BLKSSZGET
retornar unsigned int
em vez disso).
#include <sys/ioctl.h>
#include <linux/fs.h>
int fd = open("/dev/sda");
unsigned long blockSize = 0;
int rc = ioctl(fd, BLKSSZGET, &blockSize);