Frage

Ich habe /proc/diskstats verwendet, um die Anzahl der gelesenen und geschriebenen Sektoren zu ermitteln.Ich möchte diese Zahl in Bytes umwandeln, also suche ich nach der Sektorgröße.ich benutzte Wie finde ich die Disketten-/CD-Sektorgröße unter Linux? um die Sektorgröße der Festplatten sda, sda1 und sda2 zu ermitteln, schlägt jedoch mit den folgenden Fehlern fehl:Fehlgeschlagenes IOCTL in Datei /Dev /SDA mit Fehler ungültiges Argument fehlgeschlagen ioctl in Datei /dev /sda1 mit unangemessenem IOCTL für Geräte und dasselbe für SDA2.Ich werde Ihre Hilfe zu schätzen wissen.Danke

          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);
          }
War es hilfreich?

Lösung

Das ioctl funktioniert nicht immer für bestimmte Arten von Blockgeräten, aber was noch wichtiger ist, dieser Wert ist es nicht die tatsächliche Sektorgröße, wie in angegeben /proc/diskstats.

Der Diskstats-Code gibt die Anzahl der gelesenen Sektoren zurück, wobei die Größe der Sektoren anhand des zurückgegebenen Werts ermittelt wird BLKSSZGET:

    int sector_size = 0;
    int err = ioctl(fd, BLKSSZGET, &sector_size);
    if (err > 0) {
        currBytesPerSector = sector_size;
    }
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top