附加到 /proc 文件系统中的文件
Append to a file in the /proc file system
我正在 /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 打开的文件将始终在您调用 write() 时追加数据,无论 llseek() 在何处设置 f_pos。但是 f_pos 对 read() 仍然有效。
其次,内核框架不知道文件长度,除非它调用你的 llseek 来找出,但这不会发生,因为它会搞砸 f_pos,所以内核期望你的驱动程序,这是只有知道真正的 "end of the file" 在哪里的人才能在 (file->f_flags & O_APPEND) 为真时采取相应的行动。基本上,您的驱动程序需要在调用 write() 时检查该标志并忽略 offs 参数并执行追加。
我正在 /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 打开的文件将始终在您调用 write() 时追加数据,无论 llseek() 在何处设置 f_pos。但是 f_pos 对 read() 仍然有效。
其次,内核框架不知道文件长度,除非它调用你的 llseek 来找出,但这不会发生,因为它会搞砸 f_pos,所以内核期望你的驱动程序,这是只有知道真正的 "end of the file" 在哪里的人才能在 (file->f_flags & O_APPEND) 为真时采取相应的行动。基本上,您的驱动程序需要在调用 write() 时检查该标志并忽略 offs 参数并执行追加。