我正在实现一个文件,在/proc
其中我希望比平时更像文件。特别是,我想检测出有人将文件追加到文件中并正确地进行处理-也就是说,我想区分某人正在执行该操作
echo value > /proc/my_proc_file
和
echo value >> /proc/my_proc_file
像所有写函数一样,我的第四个参数被赋予一个偏移量:
ssize_t my_proc_write(struct file *file, const char __user *buf,
size_t count, loff_t *offs)
但*offs
始终为0。
设置proc文件时,我将其指定seq_lseek
为lseek函数:
struct file_operations my_proc_fops = {
.open = my_proc_open,
.read = seq_read,
.write = my_proc_write,
.llseek = seq_lseek,
};
检查源(在中fs/seq_file.c
),它看起来像要进行适当的seq_lseek
维护file->f_pos
,但是当我file->f_pos
在写函数中查看时,它也始终为0。(这可能不足为奇,因为附加通常意味着打开O_APPEND
它不会导致对lseek的任何显式调用。)
无论如何,有没有办法做到这一点?如果这些写函数不会不时传递有用的非零值,则可能不会使用偏移指针参数设置这些写函数。
首先,从用户角度来看,无论f_pos由llseek()设置在何处,使用O_APPEND打开的文件始终会在您调用write()时追加数据。但是f_pos对read()仍然有效。
第二,内核框架不知道文件长度,除非它调用您的llseek找出来,但这不会发生,因为它将弄乱f_pos,因此内核期望您的驱动程序,这是唯一知道真正的驱动程序在哪里的驱动程序。文件末尾”,则在(file-> f_flags&O_APPEND)为true时采取相应措施。基本上,驱动程序需要在调用write()时检查该标志,并忽略offs参数并执行附加操作。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句