附加到proc文件

时间:2016-11-28 01:22:28

标签: linux linux-kernel proc

我正在/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的任何显式调用。)

无论如何,有没有办法做到这一点?假设这些写函数不会使用偏移指针参数设置,如果它们不时传递有用的非零值...

1 个答案:

答案 0 :(得分:1)

首先,从用户角度来看,无论f_pos由llseek()设置在哪里,使用O_APPEND打开的文件始终会在您调用write()时追加数据。但是f_pos对read()仍然有效。

第二,内核框架不知道文件长度,除非它调用您的llseek找出来,但这不会发生,因为它将弄乱f_pos,因此内核期望您的驱动程序,这是唯一知道驱动程序在哪里的驱动程序真正的“文件结尾”,在(file-> f_flags&O_APPEND)为true时采取相应措施。基本上,驱动程序需要在调用write()时检查该标志,并忽略offs参数并执行附加操作。