Según man 5 proc
, se puede utilizar el sistema de archivos /proc
para acceder a la siguiente información en Linux:¿Cuál es la mejor manera de leer desde las interfaces Linux/proc utilizando el código de espacio de usuario C?
/proc/[pid]/maps
A file containing the currently mapped memory regions and their access
permissions.
The format is:
address perms offset dev inode pathname
08048000-08056000 r-xp 00000000 03:0c 64593 /usr/sbin/gpm
08056000-08058000 rw-p 0000d000 03:0c 64593 /usr/sbin/gpm
08058000-0805b000 rwxp 00000000 00:00 0
40000000-40013000 r-xp 00000000 03:0c 4165 /lib/ld-2.2.4.so
40013000-40015000 rw-p 00012000 03:0c 4165 /lib/ld-2.2.4.so
4001f000-40135000 r-xp 00000000 03:0c 45494 /lib/libc-2.2.4.so
40135000-4013e000 rw-p 00115000 03:0c 45494 /lib/libc-2.2.4.so
4013e000-40142000 rw-p 00000000 00:00 0
bffff000-c0000000 rwxp 00000000 00:00 0
where "address" is the address space in the process that it occupies,
"perms" is a set of permissions:
r = read
w = write
x = execute
s = shared
p = private (copy on write)
"offset" is the offset into the file/whatever, "dev" is the device
(major:minor), and "inode" is the inode on that device. 0 indicates
that no inode is associated with the memory region, as the case would
be with BSS (uninitialized data).
Under Linux 2.0 there is no field giving pathname.
Realmente no quiero estar escribiendo código de análisis de texto en C; Prefiero simplemente hacer llamadas al sistema operativo y leer la información directamente en las estructuras. Busqué en /usr/include/linux
para ver si había una estructura obvia con las API, pero no vi nada.
Así, dos preguntas parte:
- Puede esto ser considerada como una "mala idea"? Es decir, ¿los programas de usuario simplemente muerden la viñeta y leen el texto de
/proc
en caso de que las interfaces del kernel cambien? Si es así, ¿hay una "mejor práctica" aceptada para leer desde/proc
usando C? (fscanf()
? Expresiones regulares?) - ¿Qué debo hacer para encontrar la documentación para las interfaces del núcleo (suponiendo que existan) que me permita leer estos datos directamente? (¿Es el origen del kernel en sí el mejor lugar para comenzar? En caso afirmativo, ¿en qué parte del núcleo debo buscar?) Puntos de bonificación si sabe qué interfaz puede proporcionar los datos de
/proc/[pid]/maps
específicamente. =)
Busybox "superior" al menos lee/archivos de proc y los raspa la pantalla. Creo que hay diversa información que no está disponible de otra manera desde Userland. Es feo, sin embargo. – blueshift
parece sencillo con 'strtok' y' atoi'.''\ n'' es un separador de registros,'' ''es un separador de campo, y luego' perms' probablemente necesitará una cantidad mínima de lógica especial. – bkconrad
usando sscanf es más rápido que 'strtok' y' atoi'. – Paschalis