カーネル空間のバッファにファイルを読み込むための読み込み関数を作成しました。カーネルの2回目の読み込みは、最初のインスタンスをオーバーライドします。
int readfile(const char *filename, void *buf, int len, int offset)
{
struct file *filp;
mm_segment_t oldfs;
int bytes;
filp = NULL;
filp = filp_open(filename, O_RDONLY, 0);
if(!filp || IS_ERR(filp)) {
printk(" Error in reading file %s. Error = %d\n", filename, \
(int) PTR_ERR(filp));
return -1;
}
filp->f_pos = offset;
oldfs = get_fs();
set_fs(get_ds());
bytes = vfs_read(filp, buf, len, &filp->f_pos);
set_fs(oldfs);
filp_close(filp, NULL);
return bytes;
}
さて、この機能は本当にうまく機能し、私はその後、私のシステムコール
char *firstbuffer;
firstbuffer = kmalloc(sizeof(PAGE_SIZE), GFP_KERNEL);
bytesread = readfile(firstfile, firstbuffer, len, 0);
// Null terminate read string
firstbuffer[bytesread] = '\0';
printk("first buffer = %s\n",firstbuffer);
からこの関数を呼び出すことにより、BUFにfilenameの内容を読み取ることができています、私は読むためにもう一度この関数を呼び出しています第2のファイルの内容を第2のバッファに入れる。
char *secondbuffer;
secondbuffer = kmalloc(sizeof(PAGE_SIZE), GFP_KERNEL);
bytesread2 = readfile(secondfile, secondbuffer, len, 0);
// Null terminate read string
secondbuffer[bytesread2] = '\0';
printk("second buffer %s", secondbuffer);
問題がsecondfileの読み取り機能を呼び出した後、私のfirstbufferの内容はsecondbufferの内容で上書きなっていることです。例えば
:firstfileの内容はsecondfileの
A
B
C
及びコンテンツである場合、最初のファイルの呼び出しを読んだ後
X
Y
Z
次いで、firstbufferの含有量がされています
A
B
C
を読み込み、2回目の読み込みファイル呼び出しの後、最初のバッファの内容は
A
X
Y
Z
ここで何がうまくいかないのかは分かりませんが、2回目のread関数呼び出しの後、firstbufferの内容がsecondbufferの内容とマージされています。これをどうやって解決するのですか?
免責事項:
私たちはカーネル空間でファイルI/Oを行うべきではありません知っています。これは、純粋にカーネル空間での読み取り関数の働きを学ぶことです。
'firstbuffer'と' secondbuffer'の値を印刷できますか?例えば、 'printf(" 1%p \ n2:%p \ n "、firstbuffer、secondbuffer);' – jxh
@jxh:はい私はその値を表示できます。 printk( "%s \ n、firstbuffer)とprintk("%s \ n、secondbuffer ")を使ってください。 – Piyush
@JohnKugelman:完了。 mcvの例が追加されました。 – Piyush