0

古い「atoi」のようなものを使いたいのですが、カーネル空間にそれがないことがわかりました。

モジュールのwriteメソッドにこのコードがあります。書き込みはユーザースペースで私によって制御されており、ユーザーは常に次の形式で何かを書き込むことになります。

「0.99.57.6」

したがって-私はそれを解析するためにこのコードを持っています:

 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);
...

次に、次のように、モジュールが作成するprocfileをエコーする(writeメソッドを呼び出す)ことでモジュールをトリガーします。

echo "0.9 9.8 3.4 " > name_of_my_proc

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

カーネルに印刷し直すとき...私が望むように何も実行されません!私の0.9は0に殺されます(それが理にかなっているなら、それは正当なlong long値ではありません)。最も重要なことは、私のdoubleは変換されず、文字%fを出力するだけです。入力したとおりに印刷するにはどうすればよいですか?

ありがとう

4

1 に答える 1

1

間違ったスキャンコードを使用しています。

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

long longまた、は整数データ型であり、小数を格納できないことにも注意してください。

于 2012-10-01T14:03:57.837 に答える