PDA

View Full Version : C - dirigere output da printk


markzzz
26-05-2010, 21:59
salve,

avrei la necessità di dirigere l'output di printk su un determinato terminale.

ho letto questa guida (http://www.makelinux.net/ldd3/chp-4-sect-2.shtml) , ma da quanto ho capito non posso fare quello che vorrei fare.

apro qemu e tre terminali diversi,
- terminale 1 : dò insmod nomemodulo.ko (e voglio che tutti i printk stampino su questo terminale)
- terminale 2 : apro programma1.c
- terminale 3 : apro programma2.c

quindi non ho nessun programma reale che parte...deve solo tornarmi i messaggi sul terminale 1!

a stò punto potrei abbandonare l'idea di stampare su terminale, ma potrei crearmi un file con il log di tutte le operazioni fatte (al posto che stamparle a video, e perderle una volta tolto il modulo dal kernel e riavviato il sistema )

ma da kernel mode è possibile aprire/salvare file? sicuramente si... però le solite funzioni come fopen() ecc ecc non credo siano disponibili (le singole librerie tipo stdio non posso nemmeno inserirle...)

idee?

Teo@Unix
27-05-2010, 11:25
salve,

avrei la necessità di dirigere l'output di printk su un determinato terminale.

ho letto questa guida (http://www.makelinux.net/ldd3/chp-4-sect-2.shtml) , ma da quanto ho capito non posso fare quello che vorrei fare.

apro qemu e tre terminali diversi,
- terminale 1 : dò insmod nomemodulo.ko (e voglio che tutti i printk stampino su questo terminale)
- terminale 2 : apro programma1.c
- terminale 3 : apro programma2.c

quindi non ho nessun programma reale che parte...deve solo tornarmi i messaggi sul terminale 1!


Stai utilizzando una interfaccia grafica o server X?
Nel caso la risposta sia si, printk() non ti stampa su Xterminal.


ma da kernel mode è possibile aprire/salvare file? sicuramente si... però le solite funzioni come fopen() ecc ecc non credo siano disponibili (le singole librerie tipo stdio non posso nemmeno inserirle...)

idee?

Quando programmi a livello di kernel non puoi utilizzare la libc. Pertanto non puoi usare tutte le sue funzioni.
Nel kernel molte di queste sono reimplementate in modo differente e più adatto all'utilizzo in kernel-mode.

Per vedere cosa hai già a disposizione devi cercare tra i simboli esportati dal kernel, ad esempio cercando fork(), farei:
# cat kallsyms | grep 'do_fork$'
il file kallsyms lo trovi in /proc.

Per quanto riguarda la redirezione io non credo si può fare di default però dando un occhio nel sorgente di printk ho trovato questa interessante funzione:

/*
* Write a message to a certain tty, not just the console. This is used for
* messages that need to be redirected to a specific tty.
* We don't put it into the syslog queue right now maybe in the future if
* really needed.
*/
void tty_write_message(struct tty_struct *tty, char *msg)
{
if (tty && tty->driver.write)
tty->driver.write(tty, 0, msg, strlen(msg));
return;
}

prova ad approfondire la cosa.. semmai.