Secondo man 5 proc
, si può usare il filesystem /proc
per accedere alle seguenti informazioni su Linux:Qual è il modo migliore per leggere dalle interfacce Linux/proc utilizzando il codice spazio utente 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.
Non voglio davvero essere la scrittura di codice di testo analisi in C; Preferisco semplicemente effettuare chiamate al sistema operativo e leggere le informazioni direttamente nelle strutture. Ho cercato in /usr/include/linux
per verificare se esistesse una struttura evidente con le API, ma non ho visto nulla.
Così, due domanda parte:
- Può questo essere considerata una "cattiva idea"? Cioè, i programmi utente dovrebbero solo mordere il proiettile e leggere il testo da
/proc
nel caso in cui le interfacce del kernel cambino? In tal caso, esiste una "best practice" accettata per la lettura da/proc
utilizzando C? (fscanf()
? Le espressioni regolari?) - Come potrei fare per trovare la documentazione per le interfacce del kernel (supponendo che esistano) che mi consentirebbe di leggere direttamente questi dati? (La sorgente del kernel è di per sé il posto migliore da cui partire? Se sì, dove devo cercare nel sorgente del kernel?) Punti bonus se sai quale interfaccia può fornire i dati in modo specifico. =)
Busybox "top" almeno legge/proc file e li salva sullo schermo. Penso che ci siano varie informazioni che non sono disponibili in nessun altro modo da parte dell'utente. È brutto, però. – blueshift
sembra semplice con 'strtok' e' atoi'.''\ n'' è un separatore di record,' '' 'è un separatore di campo, e quindi' permanenti' avranno probabilmente bisogno di una quantità minima di logica speciale. – bkconrad
utilizzando sscanf è più veloce di 'strtok' e' atoi'. – Paschalis