古い「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を出力するだけです。入力したとおりに印刷するにはどうすればよいですか?
ありがとう