在Linux C ++应用程序中获取SCSI磁盘名称的方法

时间:2013-04-26 05:47:04

标签: c++ linux disk scsi

在我的Linux C ++应用程序中,我想获得所有SCSI磁盘的名称 系统。例如/ dev / sda,/ dev / sdb,...等等。

目前我使用以下代码从文件/ proc / scsi / sg / devices输出中获取它:


    host    chan SCSI id    lun     type    opens   qdepth  busy    online
    0       0       0       0       0       1       128     0       1
    1       0       0       0       0       1       128     0       1
    1       0       0       1       0       1       128     0       1
    1       0       0       2       0       1       128     0       1

// If SCSI device Id is > 26 then the corresponding device name is like /dev/sdaa or /dev/sdab etc.
    if (MAX_ENG_ALPHABETS <= scsiId)
    {
        // Device name order is: aa, ab, ..., az, ba, bb, ..., bz, ..., zy, zz.
        deviceName.append(1, 'a'+ (char)(index / MAX_ENG_ALPHABETS) - 1);
        deviceName.append(1, 'a'+ (char)(index % MAX_ENG_ALPHABETS));
    }
    // If SCSI device Id is < 26 then the corresponding device name is liek /dev/sda or /dev/sdb etc.
    else
    {
        deviceName.append(1, 'a'+ index);
    }

但文件/ proc / scsi / sg / devices还包含以前存在于系统中的磁盘信息。例如,如果我从系统中分离磁盘(LUN)/ dev / sdc 文件/ proc / scsi / sg / devices仍包含无效的/ dev / sdc信息。

告诉我有没有不同的方法来获取SCSI磁盘名称?喜欢系统调用吗?

谢谢

2 个答案:

答案 0 :(得分:0)

您只需阅读所有文件的列表,例如/dev/sd*(在C中,您需要使用opendir / readdir / closedir)并按{{过滤} 1}}(其中X是一个或两个字母)。

此外,您可以通过阅读单个文件sdX获取所有分区的列表,然后按/proc/partitions过滤第4个字段:

sdX

它将为您提供所有物理磁盘的列表及其容量(第3个字段)。

答案 1 :(得分:0)

从/ proc / scsi / sg / devices获取磁盘名称列表后,您可以通过代码验证是否存在。例如,安装sg3-utils,并使用sg_inq查询磁盘是否处于活动状态。