Mik*_*ike 7 c linux file-descriptor kernel-module linux-kernel
这可能听起来像一个奇怪的问题,但当我去打开文件时:
int fd;
fd = open("/dev/somedevice", O_RDWR);
Run Code Online (Sandbox Code Playgroud)
我究竟回到了什么地方?我可以看到手册页说:
The open() function shall return a file descriptor for the named file that is the lowest file descriptor not currently open for that process
但是这样吗?它只是一个int或是否在幕后附加了数据?我问的原因是我找到了一些代码(Linux/C),我们从用户空间打开文件:
//User space code:
int fdC;
if ((fdC = open(DEVICE, O_RDWR)) < 0) {
printf("Error opening device %s (%s)\n", DEVICE, strerror(errno));
goto error_exit;
}
while (!fQuit) {
if ((nRet = read(fdC, &rx_message, 1)) > 0) {
Run Code Online (Sandbox Code Playgroud)
然后在内核端,该模块的文件操作(提供fd)映射读取到n_read()函数:
struct file_operations can_fops = {
owner: THIS_MODULE,
lseek: NULL,
read: n_read,
Run Code Online (Sandbox Code Playgroud)
然后在文件描述符中使用n_read(),但是它被访问以获取数据:
int n_read(struct file *file, char *buffer, size_t count, loff_t *loff)
{
data_t * dev;
dev = (data_t*)file->private_data;
Run Code Online (Sandbox Code Playgroud)
所以...我想这里发生的事情是:
A)从中返回的文件描述符open()包含的数据不仅仅是描述性整数值
或者
B)用户空间中"读取"调用之间的映射并不像我正在做的那样简单而且有一些代码在这个等式中缺失.
任何可能有助于指导我的输入?
Nom*_*mal 10
文件描述符只是一个int.内核使用它作为索引包含所有相关信息,包括文件的位置,文件OPS(内核函数提供一个表read(),write(),mmap()等的系统调用),等等.
当您open()使用文件或设备时,内核会为您的进程创建一个新的文件描述符条目,并填充内部数据,包括文件操作.
当您使用read(),write(),mmap()等有一个有效的文件描述符,内核简单地查找正确的内核函数来调用基于它具有的文件描述符表(和文件描述符索引)文件欢声笑语.它真的很简单.