Linux VFS中sys_open,sys_read,sys_readv,sys_write,sys_writev关系 2 http://blog.chinaunix.net/uid-2836

本文探讨了Linux VFS中sys_open、sys_read、sys_write等系统调用的关系及实现细节,包括它们如何关联文件描述符与文件结构,以及文件系统如何通过不同函数指针实现读写操作。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

http://blog.chinaunix.net/uid-28362602-id-3426625.html                    分类: LINUX

1.sys_read(v),sys_write(v),sys_open调用先后问题
 
    sys_read(v),sys_write(v)调用之前,如果之前没有调用过sys_open,那么用户空间一定会想办法调用sys_open来建立进程task_struct,struct file,以及分配一个文件描述符三者之间的关系
    sys_read(v),sys_write(v)本身不会去建立文件描述符到struct file的联系(所以需要先调用sys_open来建立),它直接通过文件描述符去索引这个struct file结构体,以保证sys_read(v),sys_write(v)能够通过文件描述符直接找到对应的struct file结构体
 
2.具体文件系统(如ext3)必须实现VFS中的函数指针file->file_operation->read,file->file_operation->aio_read两者之中的至少一个
 
3.具体文件系统(如ext3)必须实现VFS中的函数指针file->file_operation->write,file->file_operation->aio_write两者之中的至少一个
 
4.sys_read优先调用file->file_operation->read
 
     file->file_operation在sys_open系统调用中被赋值为inode->file_operation,file_operation->read这个函数实现有具体的文件系统来实现,如ext3文件系统实现了这个函数
    之所以说优先调用是因为文件系统可以不实现这个函数(因为如2,3中所说,只需至少实现一个即可),那么最终调用file->file_operation->aio_read,但长度参数为1
    sys_write原理基本同sys_read
 
5.sys_readv优先调用file->file_operation->aio_read
 
    同4.file->file_operation在sys_open系统调用中被赋值为inode->file_operation,file_operation->aio_read这个函数实现有具体的文件系统来实现,如ext3文件系统实现了这个函数
    之所以说优先调用是因为文件系统可以不实现这个函数(因为如2,3中所说,只需至少实现一个即可),如果具体文件系统没有实现这个函数,则循环 readv()中长度参数 次file->file_operation->read来实现
    sys_writev原理基本同sys_readv
 
6.如果具体文件系统(如ext3)2,3中所说两种函数都实现了,那么sys_read调用file->file_operation->read(但实际调用的还是do_sync_read,do_sync_write,即最终还是调用长度为1的file_operation->aio_readv),sys_readv调用file->file_operation->aio_readv
   sys_write,sys_writev同理
 
7.无论是调用sys_read(v),还是sys_write(v),过程中如果读或写入操作没有完成则显式调用进程调度函数,本进程可能被挂起来且进程状态为TASK_UNINTERRUPTIBLE。直到最终读或写入完成,读或写成功后进程状态会变为TASK_RUNNING(读操作读取到的数据会放在用户空间的buf内存区,写操作buf内存区的内容已经写入成功)
 
8.我们常用的ext3文件系统,file_operations->read(v),file_operations->write(v)都实现了,所以用户空间read,readv(或者write,writev)分别调用的是不同的函数来完成,(当然,7中所说任何具体文件系统都成立)
 
 9.每次sys_open系统调用都会分配一个struct file结构体和一个本进程没有使用的文件描述符并且建立两者的关联。并且在内存中会建立这个文件的dentry,inode,vfsmount,以及各级父目录的dentry,inode,vfsmount
     如你访问“/usr/bin/make”,那么“usr” ,"bin",“make”三者的dentry,inode,vfsmount都会建立
 
10.sys_read(v),sys_write(v)在结束之后,如果没有别的进程在使用对应的struct file,dentry,vfsmount,那么本进程会去从其超级块的文件链表中断开连接,但是struct file 结构体并没有释放,释放是在内核态返回用户态才调用回调函数完成的;否则连接都不用断开,值减少引用计数
 
 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值