C++ ‘;投票’;普通磁盘文件的功能在Linux源代码中实现?

C++ ‘;投票’;普通磁盘文件的功能在Linux源代码中实现?,c++,c,linux,file,linux-kernel,C++,C,Linux,File,Linux Kernel,Linux的磁盘文件在内核中使用“文件”结构表示。文件结构中有一个“file_operations”,它是指针数组,其中一个是“poll”函数指针。详情如下: struct file { ... Const struct file_operations * f_op; ... } struct file_operations { ... Ssize_t (* read) (struct file *, char __user *, size_t, loff_t *); ... Ssize_t

Linux的磁盘文件在内核中使用“文件”结构表示。文件结构中有一个“file_operations”,它是指针数组,其中一个是“poll”函数指针。详情如下:

struct file {
...
Const struct file_operations * f_op;
...
}

struct file_operations {
...
Ssize_t (* read) (struct file *, char __user *, size_t, loff_t *);
...
Ssize_t (* write) (struct file *, const char __user *, size_t, loff_t *);
...
Unsigned int (* poll) (struct file *, struct poll_table_struct *);
...
}
我还知道磁盘文件的读写将通过一层虚拟文件系统(VFS)

我想问的是:


虚拟文件系统是否实现“轮询”功能

Linux源代码中实现的普通磁盘文件的“轮询”功能在哪里

Linux源代码中实现的普通磁盘文件的“轮询”功能在哪里

轮询
功能未为“普通文件实施

对于此类文件,
读取
写入
操作是从不阻塞,因此轮询它们总是会立即返回


轮询对于特殊文件(如管道或套接字)很有用。只有那些文件实现了轮询功能。

“虚拟文件系统是否实现了轮询功能?”-不,它没有。“Linux源代码中实现的普通磁盘文件的“poll”功能在哪里?”-只需在文件系统驱动程序中grep“poll”一词。@Tsyvarev在“/fs”目录或“/drivers”目录中查找?文件系统驱动程序位于
fs/
子目录下。例如,
fs/ext4/
包含ext4文件系统的驱动程序。@Tsyvarev我发现了很多poll方法的实现,我不知道是哪一个?我从一个普通文件中读取或写入一些新字节,那么poll函数立即返回什么呢?poll函数不会阻塞自身。阻塞由进程调度功能完成。读取或写入一些新字节应该会解除阻止?通过“轮询”文件,我的意思是调用系统调用,如对该文件调用
select
/
poll
/
epoll
。这些系统调用由VFS实现,因此它们可以用于每个文件。默认情况下,所有文件都被视为可在不阻塞的情况下进行读写。因此,如果您为
POLLIN
事件轮询常规(“普通”)文件,轮询将立即返回,并报告该文件已准备好进行
POLLIN
事件。
poll
是一种文件操作,应该为需要非默认轮询行为的文件实现。常规(“普通”)文件不实现此功能。常规(“普通”)文件不实现此功能,因此轮询函数按常规(“普通”)文件返回0?驱动程序中的
poll
函数应返回操作掩码,该掩码已可用于文件。因此说明“默认情况下,所有文件都被视为可在不阻塞的情况下读写”意味着
poll
的“默认实现”返回
POLLIN | POLLOUT
。(也就是说,如果未为文件设置
poll
,则在进一步的VFS计算中使用POLLOUT而不是调用此函数
POLLIN)