2013-11-17 2 views
1

Я использовал/proc/diskstats, чтобы получить число секторов, прочитанных и написанных. Я хочу преобразовать это число в байты, поэтому я ищу размер сектора. Я использовал How to find floppy\ CD sector size in Linux?, чтобы получить размер сектора дисков sda, sda1 и sda2, но он не справляется со следующими ошибками: не удалось ioctl на файле/dev/sda с ошибкой Неверный аргумент не удалось ioctl на файле/dev/sda1 с ошибкой Несоответствующий ioctl для устройства и то же самое для sda2. Поблагодарите вашу помощь. БлагодаряНе удалось выполнить ioctl на определенных дисках

  struct hd_driveid id; 
      string fileName = "/dev/"; 
      fileName += diskName; 
      int fd; 

      fd = open(fileName.c_str(), O_RDONLY|O_NONBLOCK); 
      if (fd < 0) { 
       LogError("Cannot open file " << fileName); 
      } 
      else 
      { 
       if (ioctl(fd, HDIO_GET_IDENTITY, &id) < 0) { 
        LogError("failed ioctl on with error " << strerror(errno)); 
       } else { 
        currBytesPerSector = id.sector_bytes; 
       } 
       close(fd); 
      } 
+0

Я редактировал код в вопросе вы связаны, он был недействителен и пропусканием дикий указатель вокруг. – nos

+0

Я уже делал изменения для меня раньше, и это все еще не сработало. – walla

+0

Связано это с [этот вопрос] (http://askubuntu.com/questions/103065/why-do-i-get-hdio-get-identity-failed-message-when-booting-with-external-usb- час)? – Petesh

ответ

1

Это ioctl не всегда работает для некоторых типов блочных устройств, но, что более важно, это значение не фактического размера сектора, как сообщается в /proc/diskstats.

код diskstats возвращает количество секторов для чтения, где секторы размером от значения, возвращаемого из BLKSSZGET:

int sector_size = 0; 
    int err = ioctl(fd, BLKSSZGET, &sector_size); 
    if (err > 0) { 
     currBytesPerSector = sector_size; 
    } 
+0

Работы, большое спасибо! – walla

Смежные вопросы