Skip to content
GitLab
Projects
Groups
Snippets
Help
Loading...
Help
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in
Toggle navigation
L
linux-0.11
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Analytics
Analytics
Repository
Value Stream
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Commits
Open sidebar
xpstem
linux-0.11
Commits
2e3a5aa0
Commit
2e3a5aa0
authored
Aug 29, 2014
by
karottc
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
给fs/read_write.c文件增加注释-(2)--done.
parent
281658d7
Changes
1
Hide whitespace changes
Inline
Side-by-side
Showing
1 changed file
with
27 additions
and
1 deletion
+27
-1
fs/read_write.c
fs/read_write.c
+27
-1
No files found.
fs/read_write.c
View file @
2e3a5aa0
...
...
@@ -75,15 +75,25 @@ int sys_lseek(unsigned int fd,off_t offset, int origin)
return
file
->
f_pos
;
}
//// 读文件系统调用
// 参数fd是文件句柄,buf是缓冲区,count是预读字节数
int
sys_read
(
unsigned
int
fd
,
char
*
buf
,
int
count
)
{
struct
file
*
file
;
struct
m_inode
*
inode
;
// 函数首先对参数有效性进行判断。如果文件句柄值大于程序最多打开文件数NR_OPEN,
// 或者需要读取的字节计数值小于0,或者该句柄的文件结构指针为空,则返回出错码并
// 退出。若需读取的字节数count等于0,则返回0退出。
if
(
fd
>=
NR_OPEN
||
count
<
0
||
!
(
file
=
current
->
filp
[
fd
]))
return
-
EINVAL
;
if
(
!
count
)
return
0
;
// 然后验证存放数据的缓冲区内存限制。并取文件的i节点。用于根据该i节点的属性,分
// 别调用相应的读操作函数。若是管道文件,并且是读管道文件模式,则进行读管道操作,
// 若成功则返回读取的字节数,否则返回出错码,退出。如果是字符型文件,则进行读
// 字符设备操作,并返回读取的字符数。如果是块设备文件,则执行块设备读操作,并
// 返回读取的字节数。
verify_area
(
buf
,
count
);
inode
=
file
->
f_inode
;
if
(
inode
->
i_pipe
)
...
...
@@ -92,6 +102,10 @@ int sys_read(unsigned int fd,char * buf,int count)
return
rw_char
(
READ
,
inode
->
i_zone
[
0
],
buf
,
count
,
&
file
->
f_pos
);
if
(
S_ISBLK
(
inode
->
i_mode
))
return
block_read
(
inode
->
i_zone
[
0
],
&
file
->
f_pos
,
buf
,
count
);
// 如果是目录文件或者是常规文件,则首先验证读取字节数count的有效性并进行调整(若
// 读去字节数加上文件当前读写指针值大于文件长度,则重新设置读取字节数为文件长度
// -当前读写指针值,若读取数等于0,则返回0退出),然后执行文件读操作,返回读取的
// 字节数并退出。
if
(
S_ISDIR
(
inode
->
i_mode
)
||
S_ISREG
(
inode
->
i_mode
))
{
if
(
count
+
file
->
f_pos
>
inode
->
i_size
)
count
=
inode
->
i_size
-
file
->
f_pos
;
...
...
@@ -99,19 +113,30 @@ int sys_read(unsigned int fd,char * buf,int count)
return
0
;
return
file_read
(
inode
,
file
,
buf
,
count
);
}
// 执行到这里,说明我们无法判断文件的属性。则打印节点文件属性,并返回出错码退出。
printk
(
"(Read)inode->i_mode=%06o
\n\r
"
,
inode
->
i_mode
);
return
-
EINVAL
;
}
//// 写文件系统调用
// 参数fd是文件句柄,buf是用户缓冲区,count是欲写字节数。
int
sys_write
(
unsigned
int
fd
,
char
*
buf
,
int
count
)
{
struct
file
*
file
;
struct
m_inode
*
inode
;
// 同样地,我们首先判断函数参数的有效性。若果进程文件句柄值大于程序最多打开文件数
// NR_OPEN,或者需要写入的字节数小于0,或者该句柄的文件结构指针为空,则返回出错码
// 并退出。如果需读取字节数count等于0,则返回0退出。
if
(
fd
>=
NR_OPEN
||
count
<
0
||
!
(
file
=
current
->
filp
[
fd
]))
return
-
EINVAL
;
if
(
!
count
)
return
0
;
// 然后验证存放数据的缓冲区内存限制。并取文件的i节点。用于根据该i节点属性,分别调
// 用相应的读操作函数。若是管道文件,并且是写管道文件模式,则进行写管道操作,若成
// 功则返回写入的字节数,否则返回出错码退出。如果是字符设备文件,则进行写字符设备
// 操作,返回写入的字符数退出。如果是块设备文件,则进行块设备写操作,并返回写入的
// 字节数退出。若是常规文件,则执行文件写操作,并返回写入的字节数,退出。
inode
=
file
->
f_inode
;
if
(
inode
->
i_pipe
)
return
(
file
->
f_mode
&
2
)
?
write_pipe
(
inode
,
buf
,
count
)
:-
EIO
;
...
...
@@ -121,6 +146,7 @@ int sys_write(unsigned int fd,char * buf,int count)
return
block_write
(
inode
->
i_zone
[
0
],
&
file
->
f_pos
,
buf
,
count
);
if
(
S_ISREG
(
inode
->
i_mode
))
return
file_write
(
inode
,
file
,
buf
,
count
);
// 执行到这里,说明我们无法判断文件的属性。则打印节点文件属性,并返回出错码退出。
printk
(
"(Write)inode->i_mode=%06o
\n\r
"
,
inode
->
i_mode
);
return
-
EINVAL
;
}
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment