Linux /proc/文件系统读取称为三次
这是我的第一个内核,在下面的示例程序中,我创建了一个简单的proc/文件系统。每当我对内核进行cat时,我看到READ被调用了3次。想知道它为什么这么做 代码如下Linux /proc/文件系统读取称为三次,linux,filesystems,linux-kernel,proc,Linux,Filesystems,Linux Kernel,Proc,这是我的第一个内核,在下面的示例程序中,我创建了一个简单的proc/文件系统。每当我对内核进行cat时,我看到READ被调用了3次。想知道它为什么这么做 代码如下 cat /proc/myKernel dmesg | grep -i myKernel myKernel: Read (/proc/myKernel) called myKernel: Read (/proc/myKernel) called myKernel: Read (/proc/myKernel) called int my
cat /proc/myKernel
dmesg | grep -i myKernel
myKernel: Read (/proc/myKernel) called
myKernel: Read (/proc/myKernel) called
myKernel: Read (/proc/myKernel) called
int myKernel_read( char *buffer, char **bufferLocation, off_t offset, int bufferLength, int *eof, void *data )
{
int ret = 0;
u64 msrvalue;
printk(KERN_INFO "myKernel: Read (/proc/%s) called\n", procFile_name);
ret = sprintf(buffer, "Hello World\n");
return ret;
}
static int __init myKernel_init(void)
{
entry = create_proc_entry(procFile_name, 0644, NULL);
if(!entry)
printk(KERN_INFO "myKernel: error registering proc control file\n");
else
{
entry->read_proc = myKernel_read;
}
return 0;
}
问题在于ret值。我仍然不知道为什么称之为三次,但我必须在偏移量小于零时进行实际读取
int myKernel_read( char *buffer, char **bufferLocation, off_t offset, int bufferLength, int *eof, void *data )
{
int ret;
u64 msrvalue;
if (offset > 0)
{
/* we have finished to read, return 0 */
ret = 0;
} else
{
/* fill the buffer, return the buffer size */
// DO THE READ HERE. NOT OUTSIDE
//
printk(KERN_INFO "myKernel: Read (/proc/%s) called\n", procFile_name);
ret = sprintf(buffer, "MyKernel = %x\n", 0);
}
return ret;
}
您是否尝试过读取
cat
源代码?您正在从myKernel\u read
函数返回垃圾(未初始化的ret
变量),这意味着您不知道它返回了什么。我怀疑您也没有填写一些应该填写的输出参数(如*eof
)。试着解决这个问题,看看会发生什么。如果仍然发生这种情况,请尝试将重要参数记录到myKernel\u read
中,如offset
,以便更好地了解发生了什么。最后,“这是我的第一个内核”是什么意思?我的错。在处理所选文本时,我没有包含缓冲区填充代码行。我仍然看到三条调试消息(dnesg | grep myKernel)