C: Convertir cadenas de dobles en un módulo (también conocido como en el kernel)

StackOverflow https://stackoverflow.com//questions/12674330

  •  12-12-2019
  •  | 
  •  

Pregunta

Me encantaría usar el tipo de cosas obsoletas "Atoi", pero resulta que no lo tengo en el espacio del kernel.

Tengo este código en el método de escritura de mi módulo.Las escrituras se están controlando por mí en el espacio del usuario, y sucede que el usuario siempre escribirá algo en este formato:

"0.9 9.5 7.6"

Por lo tanto, tengo este código para analizarlo:

 ssize_t write_info( struct file *filp, const char __user *buff, unsigned long len, void *data )
{
    char *seedid;
    char *low_in;
    char *high_in;
    char *dropper;
    unsigned long long seedid_var;
    double d_1;
    double d_2;
    printk(KERN_INFO "Whaddup u writin'?\n");
    dropper = kstrdup(buff, 0);
    seedid  = strsep(&dropper, " ");
    printk("HERE IS: %s\n\n", seedid);
    sscanf(seedid, "%lld", &seedid_var);
    printk("AND BACK AGAIN: %lld\n\n\n", seedid_var);


    low_in  = strsep(&dropper, " ");
    printk("HERE IS: %s\n\n", low_in);
    sscanf(low_in, "%f", &d_1);
    printk("AND BACK AGAIN: %f\n\n", d_1);

    high_in  = strsep(&dropper, " ");
    printk("HERE IS: %s\n\n", high_in);
    sscanf(high_in, "%f", &d_2);
    printk("AND BACK AGAIN: %f\n\n", d_2);
...

Luego, desencadenar mi módulo por Echo'ing en el PROCFILE que crea (llamando a mi método de escritura) como este:

echo "0.9 9.8 3.4 " > name_of_my_proc

con dmesg:

[ 2211.808474] Whaddup u writin'?
[ 2211.808505] HERE IS: 0.9
[ 2211.808508] 
[ 2211.808514] AND BACK AGAIN: 0
[ 2211.808516] 
[ 2211.808517] 
[ 2211.808520] HERE IS: 9.8
[ 2211.808522] 
[ 2211.808524] AND BACK AGAIN: %f
[ 2211.808526] 
[ 2211.808529] HERE IS: 3.4
[ 2211.808531] 
[ 2211.808533] AND BACK AGAIN: %f

Al imprimir de regreso al kernel ... ¡Nada realiza como si me gustaría!My 0.9 se mata a 0 (es que no es un valor largo de Legit, si es así, eso tendría sentido).Lo más importante es que mis dobles no se convierten: simplemente imprime el carácter% f.¿Qué puedo hacer para hacerlos imprimir mientras los escribí?

gracias

¿Fue útil?

Solución

Está utilizando códigos de exploración incorrectos.

Scan code:  Data type:
%d          int
%ld         long
%f          float
%lf         double

También tenga en cuenta que long long es un tipo de datos entero y no puede almacenar números fraccionarios.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top