无法在特定磁盘上进行ioctl

时间:2013-11-17 13:14:12

标签: c++ linux ioctl sector

我使用/ proc / diskstats来获取读取和写入的扇区数。 我想将这个数字转换为字节,所以我寻找扇区大小。 我使用How to find floppy\ CD sector size in Linux?来获取磁盘sda,sda1和sda2的扇区大小,但它失败并出现以下错误: 文件/ dev / sda上的ioctl失败,错误无效参数 文件/ dev / sda1上的ioctl失败并显示错误设备的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);
          }

1 个答案:

答案 0 :(得分:1)

ioctl并不总是适用于某些类型的块设备,但更重要的是,此值 /proc/diskstats中报告的实际扇区大小。

diskstats代码返回读取的扇区数,其中扇区的大小取决于BLKSSZGET返回的值:

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