我正在在 /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的任何明确调用。)
无论如何,有没有办法做到这一点?据推测,如果这些写入函数不会不时传递有用的非零值,则不会使用偏移指针参数设置。
首先,从用户角度来看,使用o_append打开的文件时,无论何处f_pos由llseek()设置在何处。但是f_pos对于读取仍然有效()。
第二,内核框架dos不知道文件长度,除非它打电话给您的llseek找出答案,但这不会发生,因为它会弄乱f_pos,所以内核期望您的驾驶员,这是唯一知道在哪里的人当(file-> f_flags& append)正确时,将相应地行动的真实"文件结尾"是正确的。基本上,您的驱动程序需要在调用Write()时检查该标志并忽略fort param并进行附加。