2011-11-19 8 views
5

Posso creare qualsiasi mapping di file in procfs per riflettere lo stato interno del mio programma?Esporta lo stato del programma in procfs?

Per esempio,

main.c: 

char *message; 

... 

Assumere il pid è di 1200, è possibile creare un file/proc/1200/variabili/messaggio transitoria, che rifletterà la variabile messaggio?

Suppongo di dover lavorare con proc fs, in quanto esistono /proc/.../{net, fd, attività, ecc.}, Dove dovrei iniziare se voglio aggiungere un'altra variabile/sezione in il proc fs?

risposta

1

Non è possibile a meno che non si sta scrivendo un modulo del kernel

4

Non ci sono strumenti per fare ciò che si vuole realizzare.

ci sono alcune cose che sono vicino - gdb(1) sa come l'introspezione programmi in esecuzione e valori mostrano di alcune variabili (non tutte le variabili sopravvivere compilation - anche se il debug di -g bandiera aiuto gdb(1) scoprire ciò che le ottimizzazioni possono avere fatto al tuo programma).

Il progetto FUSE consente ai programmi dello spazio utente di fornire un file system ad altri processi tramite il kernel. Puoi usare FUSE direttamente per esportare le variabili selezionate dal tuo programma o puoi provare qualcosa di molto più ambizioso e scrivere strumenti per incapsulare le abilità di introspezione di gdb(1) con le capacità di pubblicazione di FUSE e fornire questo servizio per il mondo.

Puoi anche utilizzare 9p all'interno dei tuoi programmi - è simile nello spirito a FUSE, consentendo ai programmi di fornire interfacce alle loro funzionalità tramite interfacce di file system. (Puoi vederlo in uso nello , dove una quantità sorprendente di controllo del gestore di finestre è possibile tramite le interfacce del filesystem, consentendo una facile programmazione usando qualsiasi linguaggio tu voglia.) Potresti, ancora una volta, integrare questa con l'introspezione di gdb(1) capacità di provare a fornire questo.

Mi aspetterei che un progetto di questo tipo sia degno di un progetto di alto livello o di un progetto di scuola elementare - non qualcosa che potrebbe essere realizzato rapidamente.

3

In generale non è possibile farlo solo dallo spazio utente. procfs è il kernel che segnala il suo stato di processo. Quindi, se vuoi fare qualcosa del genere,

a) devi creare un modulo del kernel che ti permetta di comunicargli il contenuto b) attivare il recupero dei contenuti attraverso un segnale di qualche tipo.

Quindi, se davvero lo vuoi fare. Vorrei suggerire il seguente percorso:

1) Scrivere un modulo del kernel in grado di comunicare lo stato del programma. Chiamiamolo kpsmod per la nostra discussione.

2) Comunicare con lo spazio utente di comunicare con il processo utente tramite un meccanismo (ad esempio il collegamento in rete) per avviare un processo di registrazione, che registra gli indirizzi variabili. Il programma userspace dice al modulo che è interessato a "esportarsi" su un segnale (ad esempio SIGHUP o SIGUSR1); rendi anche questo programmabile. Passa il nome, l'indirizzo e le dimensioni da leggere (con informazioni sul tipo, se necessario). Se la variabile è in pila, dovrebbe essere respinta.Per questo motivo dovrebbero essere consentiti solo simboli accessibili a livello globale

3) Si può anche pensare di accedere allo stack di ptrace per il processo al momento del proc_read della variabile particolare.

4), allora il modulo del kernel dovrebbe creare una/proc/kpsmod // vars * per ogni variabile e quando la variabile viene letta

5) sul leggere il deposito del contenuto della memoria tramite proc (potenzialmente formattato)

e voilà :-) hai l'effetto desiderato.

3

Invece di utilizzare /proc, è possibile utilizzare una named pipe.

Creare un fifo utilizzando mkfifo e aprire il programma per la scrittura. In un thread dedicato o in modo asincrono, il programma genererà del testo quando qualcuno esegue cat your-pipe nella shell. cat apre la named pipe per la lettura, ovviamente.

Questo essenzialmente simula l'interfaccia cat /proc/...., ma invece di avere un modulo del kernel implementare la generazione del testo, si dispone di un programma che lo implementa.