Comment obtenir les informations sur le matériel sous Linux à l'aide de C++
J'ai besoin pour obtenir les spécifications du disque dur à Gagner et *nix machines. J'ai utilisé <hdreg.h>
sur Linux comme ceci:
static struct hd_driveid hd;
int device;
if ((device = open("/dev/sda", O_RDONLY | O_NONBLOCK)) < 0)
{
cerr << "ERROR: Cannot open device /dev/sda \n";
exit(1);
}
if (!ioctl(device, HDIO_GET_IDENTITY, &hd))
{
cout << hd.model << endl;
cout << hd.serial_no << endl;
cout << hd.heads << endl;
}
J'ai besoin de hd_driveid
de me dire quelques informations sur le disque. Je veux savoir:
- Nombre de partitions
- Spécifications de chaque partition (format, l'étiquette, les drapeaux, la taille, le point de départ, le nombre de pistes, etc.)
- Nombre de pistes par cylindre
- Nombre total de pistes
- Taille de bloc maximale
- Minimum de la taille du Bloc
- Taille de bloc par défaut
- Taille totale de l'appareil
Mes questions sont:
- Commun
(indépendant de la plate -) de manière à
connectez le matériel? Je voudrais utiliser
même code pour gagner et *nix. (même si
il n'y a aucun moyen autre que
l'incorporation de code assembleur en rpc) - Si il n'y en a pas, comment puis-je obtenir de l'information ci-dessus sous *nix?
- Certains systèmes n'ont pas de cloisons... Certains (généralement dans les *BSD) l'utilisation des "tranches" au lieu de cela, et d'autres pourraient bien être tout en utilisant le disque dur. (c'est à dire, non partitionné).
Vous devez vous connecter pour publier un commentaire.
Presque tout dans votre liste n'a rien à voir avec les "spécifications de disque dur":
hd_driveid.sector_bytes
(généralement 512, mais certains lecteurs modernes utilisent 4096). Je ne suis pas au courant d'un maximum de "taille de bloc", qui est une propriété du système de fichiers. Je suis également pas sûr de savoir pourquoi cela est utile.La taille totale dans des secteurs est en
hd_driveid.lba_capacity_2
. En outre, la taille, en octets, qui peut probablement être obtenus avec quelque chose commeNoter que dans les deux cas, il sera probablement quelques mégaoctets plus grand que les tailles calculées par C×H×S.
Il pourrait aider si tu nous disais pourquoi vous avez voulu cette information...
T=t×S
où S estsectors
et t est le nombre de pistes. Je ne sais pas ce qui estblock size
et je ne peux pas le trouver n'importe où d'autre que mes professeurs exemple en C#. dans cet exemple, il existe une instance deManagementObject
et ces informations sont extraites par une chaîne de l'indexeur... (j'ai oublié de dire que je suis en train d'écrire des devoirs à faire 🙂Non, il n'est pas indépendant de la plate-chemin. Il n'y a même pas de *nix façon. Il n'y a que Linux façon.
Dans Linux, toutes les informations pertinentes sont disponibles dans différents fichiers dans le
/proc
système de fichiers. Le/proc/devices
vous dira quels appareils il y a (les fichiers dans/dev/
peut exister même lorsque les appareils ne sont pas disponibles, même si l'ouverture échoue dans ce cas),/proc/partitions
vous dira quelles sont les partitions sont disponibles sur chaque disque et que vous aurez à chercher dans les différents sous-répertoires pour l'information. Il suffit de regarder autour sur certains linux où est-ce que vous avez besoin./proc
sont créés? Je veux gagner de matériel info moi-même dans mon programme 🙂 (de la même manière qu'elles sont générées dans/proc
)/proc/bus/ide
et/proc/bus/scsi
et quelques autres, et il y a beaucoup de fichiers avec divers éléments d'information dont vous aurez besoin de collecter.Pour GNU/Linux ont un coup d'oeil à ceci: l'obtention de disque dur de métadonnées