Soy nuevo en la programación de Linux c, ¿hay alguna API que pueda obtener información de partición de un dispositivo?Programación en Linux C: ¿Cómo obtener la información de partición de un dispositivo?
Respuesta
No conozco ninguna API para eso.
Hice ldd `which fdisk`
y no mostraba ninguna biblioteca que perteneciera a la tabla de partición de lectura, así que asumí que lo hace solo.
Un vistazo rápido al código fuente del programa fdisk
me convence aún más de que no utiliza ninguna biblioteca externa.
Si usted está interesado en entender las cosas a sí mismo y aprender por su cuenta aquí es lo que sugiero que hagas:
- Leer la página de Wikipedia sobre MBR.
- Obtenga la fuente en
fdisk
y lea el código.
El (pseudo) archivo "/ proc/particiones" contiene al menos una lista de las particiones encontradas en los dispositivos físicos. Lamentablemente, no dice nada sobre los tipos de particiones (en particular, no hay una forma simple de adivinar si una partición es realmente una extendida). Aquí es lo que encuentro en/proc/particiones de mi máquina:
major minor #blocks name
8 0 488386584 sda
8 1 13631488 sda1
8 2 237375488 sda2
8 3 1 sda3
8 4 3650560 sda4
8 5 3413781 sda5
8 6 29294496 sda6
8 7 14651248 sda7
8 8 9767488 sda8
8 9 176586448 sda9
8 16 7815168 sdb
8 17 7811136 sdb1
SDA es mi hd, SDB es una llave USB. Tenga en cuenta que sda3 es una partición extendida, pero es difícil adivinarlo sin leer directamente la tabla de particiones del disco. La información que encuentre en este archivo puede ser suficiente o no, depende de nuestras necesidades particulares. En mi humilde opinión, una forma más segura es:
1) Create a couple of pipes
2) fork a process an redirect the pipes to child's stdin and sdtout (fd 0 and 1)
3) execl "fdisk /dev/sdXXX"
4) send a "p\n" command to the child process
5) read the lines containg the complete partition information
Espero que esto pueda ayudarle.
Puede echar un vistazo a /sys/block/sd?/
donde hay muchos pseudo archivos que le informan sobre algunos parámetros de partición.
libblkid podría ser una API agradable. blkid (presente en el paquete util-linux) lo usa.
blkid enumera todas las particiones junto con la etiqueta, el tipo de sistema de archivos y el UUID. Aquí hay una salida en mi sistema.
# blkid
/dev/sda1: LABEL="grub" UUID="a760119d-916a-492c-8ec1-50f81dbf4e26" TYPE="ext2"
/dev/sda3: LABEL="Library" UUID="248D72BD2E5CF009" TYPE="ntfs"
/dev/sda5: LABEL="WinXP" UUID="545CC7085CC6E438" TYPE="ntfs"
/dev/sda6: LABEL="Win7" UUID="22F009B2F0098CEB" TYPE="ntfs"
/dev/sda7: LABEL="Puppy" UUID="fe1dc425-ad17-4773-971a-435d91690883" SEC_TYPE="ext2" TYPE="ext3"
/dev/sda8: LABEL="Linux Mint" UUID="0c61a114-9353-499b-a1cd-ba19722b1e43" TYPE="ext4"
/dev/sda9: LABEL="Ubuntu L" UUID="5f6923e1-92f4-4b3f-b613-9e78839e1987" TYPE="ext4"
/dev/loop0: TYPE="squashfs"
/dev/loop1: UUID="16e3a75d-74dc-4391-a9e2-4305c08c5707" TYPE="ext3"
/dev/loop4: TYPE="squashfs"
#
Aquí es manual de referencia: http://www.kernel.org/pub/linux/utils/util-linux/v2.21/libblkid-docs/
acabo ahora encontré esta biblioteca, a mí mismo en busca de respuesta para la misma pregunta.
La respuesta de Akash Rawal es bastante cercana. Una buena forma es usar libblkid.
Este es un ejemplo para obtener de una partición: Using libblkid to find UUID of a partition.
que combinan el código de abajo y ejemplos en el menú de referencia libblkid y generar a continuación el programa de trabajo:
#include <stdio.h>
#include <string.h>
#include <err.h>
#include <blkid/blkid.h>
int main (int argc, char *argv[]) {
blkid_probe pr = blkid_new_probe_from_filename(argv[1]);
if (!pr) {
err(1, "Failed to open %s", argv[1]);
}
// Get number of partitions
blkid_partlist ls;
int nparts, i;
ls = blkid_probe_get_partitions(pr);
nparts = blkid_partlist_numof_partitions(ls);
printf("Number of partitions:%d\n", nparts);
if (nparts <= 0){
printf("Please enter correct device name! e.g. \"/dev/sdc\"\n");
return;
}
// Get UUID, label and type
const char *uuid;
const char *label;
const char *type;
for (i = 0; i < nparts; i++) {
char dev_name[20];
sprintf(dev_name, "%s%d", argv[1], (i+1));
pr = blkid_new_probe_from_filename(dev_name);
blkid_do_probe(pr);
blkid_probe_lookup_value(pr, "UUID", &uuid, NULL);
blkid_probe_lookup_value(pr, "LABEL", &label, NULL);
blkid_probe_lookup_value(pr, "TYPE", &type, NULL);
printf("Name=%s, UUID=%s, LABEL=%s, TYPE=%s\n", dev_name, uuid, label, type);
}
blkid_free_probe(pr);
return 0;
}
Uso:
gcc -o getuuid getuuid.c -lblkid
sudo ./getuuid /dev/sdc
Number of partitions:1
Name=/dev/sdc1, UUID=754A-CE25, LABEL=KINGSTON, TYPE=vfat
- 1. Cómo obtener información de hardware en Linux usando C++
- 2. Linux de programación: el dispositivo que un archivo está en
- 3. ¿Cómo obtener el proveedor de USB y la información del producto mediante programación en Linux?
- 4. Información del dispositivo de bloque sin montar (en Linux)
- 5. ¿Cómo obtener información del dispositivo en Android
- 6. Información de partición desde CMD
- 7. C Linux dispositivo de programación - Lectura Directamente desde/dev
- 8. Recopilación de información sobre la programación de subprocesos en Linux
- 9. Linux programación de Bluetooth en c
- 10. Monte la segunda partición en un dispositivo Android con vold
- 11. Cómo obtener mediante programación la información mostrada por Información rápida en Visual Studio
- 12. Programación del controlador del dispositivo del kernel de Linux
- 13. ¿Cómo obtener información de CPU en C en Linux, como el número de núcleos?
- 14. ¿Dónde puedo obtener información sobre cómo iniciar la programación de C# con MVC/ASP.NET?
- 15. ¿Cómo obtener información del administrador de dispositivos?
- 16. Programación de sistema Linux
- 17. Cómo obtener la AssemblyVersion de un archivo .Net en Linux
- 18. ¿Cómo obtener privilegios de root mediante programación?
- 19. ¿Cómo obtener la ruta absoluta de un archivo mediante programación con out realpath() en Linux?
- 20. ¿Cómo puedo encontrar mediante programación la dirección IP/netmask/gateway configurada para un dispositivo de red específico en Linux?
- 21. Cómo obtener información de la cámara web
- 22. instrucción ilegal Cuando programación C++ en Linux
- 23. Android: Obtenga información de hardware mediante programación
- 24. ¿Cómo puedo ejecutar comandos de Linux en un dispositivo Android?
- 25. programación C# obtener Seguimiento de la pila
- 26. ¿Cómo obtener el android_id de un dispositivo?
- 27. Dónde y cómo almacenar la información del programa en Linux
- 28. Programación en (no * para *) un dispositivo Android
- 29. Información del dispositivo Android
- 30. Cómo obtener la hora actual en milisegundos programación en C
Quiere recibir la lista de particiones disponibles en un bloque dado dispositivo (presumiblemente un disco físico)? –
Podría ser un posible duplicado de http://stackoverflow.com/questions/5288034/how-get-uuid-of-a-device-partition-in-linux-programatically –
@Brian Cain sí – bright