Ioctl konnte auf bestimmten Datenträgern nicht ausgeführt werden
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);
}
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, §or_size);
if (err > 0) {
currBytesPerSector = sector_size;
}