Questo sito utilizza cookies, anche di terze parti, per mostrare pubblicità e servizi in linea con il tuo account. Leggi l'informativa sui cookies.
Username: Password: oppure
C/C++ - [RISOLTO]Geometria del disco sotto Linux
Forum - C/C++ - [RISOLTO]Geometria del disco sotto Linux

Avatar
matteo88roma (Normal User)
Rookie


Messaggi: 25
Iscritto: 15/12/2008

Segnala al moderatore
Postato alle 4:40
Sabato, 11/09/2010
Questo topic è stato chiuso dal moderatore

Ciao a tutti ragazzi!
Sto realizzando un porting di una libreria .NET scritta in C#.
Una funziona della libreria chiama una funzione nativa (P/Invoke) contenuta
all'interno della libreria kernel32 di Windows.
Questa funzione consente di ottenere informazioni utili riguardanti la geometria dell'HDD (cilindri, testine...).

Qui su Linux la mia prima idea è stata:
1) Fork del processo che richiede l'informazione.
2) Esecuzione comando shell -> sfdisk -G /dev/DISPOSITIVO
Codice sorgente - presumibilmente Plain Text

  1. Esempio output dal pc dalla quale sto scrivendo:
  2. dev/sda: 9726 cilindri, 255 testine, 63 settori/traccie


3) Comunicare al processo parent il risultato tramite FIFO.

E' una possibile soluzione ma scomoda :_doubt:

Esiste quale header di linux che mi consenta di ottenere queste informazioni senza fare troppi casini? :D

Grazie in anticipo per le risposte!

Ultima modifica effettuata da matteo88roma il 11/09/2010 alle 5:21


IT Developer/Network Architect /Consultant
Studente di Informatica presso l'Università La Sapienza di Roma
Linguaggi conosciuti: C,C++,Java,Python,VB .NET,C#,Managed C++,*NIX Scripting,Assembly(mips & intel)
E-mail: matteopacini.knopfler@gmail.com
PM
Avatar
matteo88roma (Normal User)
Rookie


Messaggi: 25
Iscritto: 15/12/2008

Segnala al moderatore
Postato alle 5:20
Sabato, 11/09/2010
Risolto! :k:

Codice sorgente - presumibilmente C++

  1. #include <fcntl.h>
  2. #include <stdio.h>
  3. #include <stdlib.h>
  4. #include <sys/ioctl.h>
  5. #include <sys/stat.h>
  6. #include <sys/types.h>
  7. #include <unistd.h>
  8.  
  9. #define HDIO_GETGEO 0x0301
  10.  
  11. struct hd_geometry {
  12.         unsigned char heads;
  13.         unsigned char sectors;
  14.         unsigned short cylinders;
  15.         unsigned long start;
  16. };
  17.  
  18. int main (int argc, char* argv[]) {
  19.         struct hd_geometry geom;
  20.         int drive_fd;
  21.  
  22.         //Il famoso hard disk del computer dalla quale sto scrivendo ^^
  23.         if ((drive_fd = open("/dev/sda",O_RDONLY))<0) {
  24.                 perror("ERROR: ");
  25.         }
  26.  
  27.         if (ioctl(drive_fd,HDIO_GETGEO,&geom)<0) {
  28.                 perror("ERROR: ");
  29.         }
  30.  
  31.         if (close(drive_fd)<0) {
  32.                 perror("ERROR: ");
  33.         }
  34.  
  35.         printf("Hard Disk Geometry:\n");
  36.         printf("Heads: %d\n",geom.heads);
  37.         printf("Sectors: %d\n",geom.sectors);
  38.         printf("Cylinders: %d\n",geom.cylinders);
  39.         printf("Start Offset: %ld\n",geom.start);
  40.  
  41.         return EXIT_SUCCESS;
  42. }



HDIO_GETGEO e la struct hd_geometry erano definiti (a quanto pare) in un file hdreg.h, sparito poi con l'avvento del kernel 2.6.
Basta ridefinire il tutto e il risultato è garantito!

Output -> (il programma va lanciato con privilegi root!)
Codice sorgente - presumibilmente Plain Text

  1. matteo@Zi0P4tch0:~/Scrivania$ sudo ./hdgeotest
  2. Hard Disk Geometry:
  3. Heads: 255
  4. Sectors: 63
  5. Cylinders: 9726
  6. Start Offset: 0



IT Developer/Network Architect /Consultant
Studente di Informatica presso l'Università La Sapienza di Roma
Linguaggi conosciuti: C,C++,Java,Python,VB .NET,C#,Managed C++,*NIX Scripting,Assembly(mips & intel)
E-mail: matteopacini.knopfler@gmail.com
PM