Не удалось выполнить ioctl на определенных дисках

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

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

person walla    schedule 17.11.2013    source источник
comment
Я отредактировал код в вопросе, на который вы указали, он недействителен и передает дикий указатель.   -  person nos    schedule 17.11.2013
comment
Я уже вносил изменения для себя раньше, но это все еще не сработало.   -  person walla    schedule 17.11.2013
comment
Связано ли это с этот вопрос?   -  person Petesh    schedule 18.11.2013


Ответы (1)


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

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

    int sector_size = 0;
    int err = ioctl(fd, BLKSSZGET, &sector_size);
    if (err > 0) {
        currBytesPerSector = sector_size;
    }
person Petesh    schedule 18.11.2013