gpt4 book ai didi

linux - 附加到/proc 文件系统中的文件

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:42:48 25 4
gpt4 key购买 nike

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

不管怎样,有没有办法做到这一点?如果这些写入函数不时不时地传入有用的非零值,那么这些写入函数可能不会设置偏移指针参数...

最佳答案

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

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

关于linux - 附加到/proc 文件系统中的文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40877986/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com