2013-04-26 7 views
0

В моем приложении Linux C++ я хочу получить имена всех SCSI-дисков, которые присутствуют в системе . например/dev/sda,/dev/sdb, ... и так далее.Способ получения имен дисков SCSI в приложении Linux C++

В настоящее время я получаю его из выходного файла/Proc/SCSI/SG/устройств, используя код ниже:

 

    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/устройства также содержит информацию о диске, который ранее присутствовал в системе. Например, если я отсоединяю диск (LUN)/dev/sdc от системы , файлы/proc/scsi/sg/devices по-прежнему содержат информацию о/dev/sdc, которая является недопустимой.

Скажите, есть ли другой способ получить имена дисков SCSI? как системный вызов?

Благодаря

+0

Возможно, вам придется пройти через '/ proc' или'/sys' –

ответ

0

Вы можете просто список всех файлов, таких как /dev/sd* чтения (в C, вам нужно будет использовать opendir/readdir/closedir) и фильтровать его sdX (где Х представляет собой одну или две буквы).

Кроме того, вы можете получить список всех разделов, читая один файл /proc/partitions, а затем фильтр 4-го поля по sdX:

$ cat /proc/partitions 
major minor #blocks name 

8  0 52428799 sda 
8  1  265041 sda1 
8  2   1 sda2 
8  5 2096451 sda5 
8  6 50066541 sda6 

, который даст вам список всех физических дисков вместе с их способностью (3-е поле).

0

После получения списка имен дисков из/proc/scsi/sg/devices вы можете проверить наличие через код. Например, установите sg3-utils и используйте sg_inq для запроса, активен ли диск.