在文件成功打開之後,進程將使用內核提供的read和write系統調用,來讀取或修改文件的數據。內核中文件讀寫操作的系統調用實現基本都一樣,下面我們看看文件的讀取。
[cpp]
- /*sys_read()*/
- SYSCALL_DEFINE3(read, unsigned int, fd, char __user *, buf, size_t, count)
- {
- struct file *file;
- ssize_t ret = -EBADF;
- int fput_needed;
- /*從fd中獲取相應文件對象地址*/
- file = fget_light(fd, &fput_needed);
- if (file) {
- /*獲取文件訪問指針*/
- loff_t pos = file_pos_read(file);
[cpp]
- /*實現*/
- ret = vfs_read(file, buf, count, &pos);
- /*位置指針移動*/
- file_pos_write(file, pos);
- /*釋放文件對象*/
- fput_light(file, fput_needed);
- }
- /*返回讀取的字節數*/
- return ret;
- }
讀取實現,返回讀取字節數
[cpp]
- ssize_t vfs_read(struct file *file, char __user *buf, size_t count, loff_t *pos)
- {
- ssize_t ret;
- /*如果標志中不允許所請求的訪問,則返回*/
- if (!(file->f_mode & FMODE_READ))
- return -EBADF;
- /*如果沒有相關的操作,則返回*/
- if (!file->f_op || (!file->f_op->read && !file->f_op->aio_read))
- return -EINVAL;
- /*檢查參數*/
- if (unlikely(!access_ok(VERIFY_WRITE, buf, count)))
- return -EFAULT;
- /*對要訪問的文件部分檢查是否有沖突的強制鎖*/
- ret = rw_verify_area(READ, file, pos, count);
- if (ret >= 0) {
- count = ret;
- /*下面的方法返回實際傳送的字節數,文件指針被適當的修改*/
- if (file->f_op->read)/*如果定義,則用他來傳送數據*/
- ret = file->f_op->read(file, buf, count, pos);
- else
- /*通用讀取例程*/
- ret = do_sync_read(file, buf, count, pos);
- if (ret > 0) {
- fsnotify_access(file->f_path.dentry);
- add_rchar(current, ret);
- }
- inc_syscr(current);
- }
- /*返回實際傳送字節數*/
- return ret;
- }