日期:2014-05-16 浏览次数:20757 次
进程A是一个读盘进程,目的是将hello.txt文件中的100字节读入buffer[100]。
代码如下:
void FunA();
void main()
{
...
FunA();
...
}
void FunA()
{
char buffer[100];
int i,j;
int fd = open("/mnt/user/user1/user2/hello.txt",O_RDWR,0644);
read(fd,buffer,sizeof(buffer));
close(fd);
for(i=0;i<1000000;i++)
{
for(j=0;i<100000;j++)
{
;
}
}
}void FunB();
void main()
{
...
FunB();
...
}
void FunB()
{
char buffer[200];
int i,j;
int fd = open("/mnt/user/user1/user2/hello.txt",O_RDWR,0644);
read(fd,buffer,sizeof(buffer));
close(fd);
for(i=0;i<1000000;i++)
{
for(j=0;i<100000;j++)
{
;
}
}
}
进程C是一个写盘进程,目的是往hello.txt文件中写入str[]中的字符“ABCDE”。
代码如下:
void FunC();
void main()
{
...
FunC();
...
}
void FunC()
{
char str1[]="ABCDE";
int i,j;
int fd = open("/mnt/user/user1/user2/hello.txt",O_RDWR,0644);
write(fd,str1,strlen(str1));
close(fd);
for(i=0;i<1000000;i++)
{
for(j=0;i<100000;j++)
{
;
}
}
}进程A启动后,执行open函数,最终会映射到sys_open函数区执行。
代码路径:fs/open.c
nt sys_open(const char * filename,int flag,int mode)
{
.../寻找空闲的file,和inode
(current->filp[fd]=f)->f_count++;
if ((i=open_namei(filename,flag,mode,&inode))<0) {
...
}
...
f->f_mode = inode->i_mode;
f->f_flags = flag;
f->f_count = 1;
f->f_inode = inode;
f->f_pos = 0;
return (fd);
} 之后开始执行read函数,read函数最终会映射到sys_read()函数去执行。
代码路径:fs/read_write.c
int sys_read(unsigned int fd,char * buf,int count)
{
struct file * file;
struct m_inode * inode;
if (fd>=NR_OPEN || count<0 || !(file=current->filp[fd]))
return -EINVAL;
...
inode = file->f_inode;
...
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;
if (count<=0)
return 0;
return file_read(inode,file,buf,count);
}
printk("(Read)inode->i_mode=%06o\n\r",inode->i_mode);
return -EINVAL;
} 之后sys_read函数调用file_read()来读取文件内容。
代码路径:fs/file_dev.c
int file_read(struct m_inode * inode, struct file * filp, char * buf, int count)
{
int left,chars,nr;
struct buffer_head * bh;
if ((left=count)<=0)
return 0;
while (left) {
if ((nr = bmap(inode,(filp->f_pos)/BLOCK_SIZE))) {
if (!(bh=bread(inode->i_dev,nr)))
break;
} else