jhluroom 弹jhluroom.blog.chinaunix.net
jhluroom
全部博文(137)
mm(2)
fs(17)
math(1)
boot(3)
init(0)
kernel(12)
blk_drv(4)
chr_drv(5)
源码疑问(1)
2011年(10)
2010年(23)
2009年(104)
高傲的活
小雅贝贝
along819
shiyigud
mcc543
yunpeng_
cynthia
pppstar
Bsolar
badb0y
dadada林
分类: LINUX
2009-08-19 15:04:53
/* * linux/fs/stat.c * * (C) 1991 Linus Torvalds */#include <errno.h>#include <sys/stat.h>#include <linux/fs.h>#include <linux/sched.h>#include <linux/kernel.h>#include <asm/segment.h>static void cp_stat(struct m_inode * inode, struct stat * statbuf)// 复制文件状态信息{// 参数inode 是文件对应的i 节点,statbuf 是stat 文件状态结构指针,用于存放取得的状态信息 struct stat tmp; int i; verify_area(statbuf,sizeof (* statbuf));//验证(或分配)存放数据的内存空间 tmp.st_dev = inode->i_dev;// 文件所在的设备号 tmp.st_ino = inode->i_num;// 文件i 节点号 tmp.st_mode = inode->i_mode;// 文件属性 tmp.st_nlink = inode->i_nlinks; // 文件的连接数 tmp.st_uid = inode->i_uid;// 文件的用户id tmp.st_gid = inode->i_gid;// 文件的组id tmp.st_rdev = inode->i_zone[0];// 设备号(如果文件是特殊的字符文件或块文件) tmp.st_size = inode->i_size;// 文件大小(字节数)(如果文件是常规文件) tmp.st_atime = inode->i_atime;// 最后访问时间 tmp.st_mtime = inode->i_mtime;// 最后修改时间 tmp.st_ctime = inode->i_ctime;// 最后节点修改时间 for (i=0 ; i<sizeof (tmp) ; i++)// 最后将这些状态信息复制到用户缓冲区中 put_fs_byte(((char *) &tmp)[i],&((char *) statbuf)[i]);}int sys_stat(char * filename, struct stat * statbuf){// 文件状态系统调用函数 - 根据文件名获取文件状态信息 struct m_inode * inode; if (!(inode=namei(filename)))// 根据给定的目录文件名找到对应的i 节点 return -ENOENT; cp_stat(inode,statbuf);// 复制文件状态信息 iput(inode);// 释放inode节点 return 0;}int sys_fstat(unsigned int fd, struct stat * statbuf){// 文件状态系统调用 - 根据文件句柄获取文件状态信息 struct file * f; struct m_inode * inode;// 如果文件句柄值大于一个程序最多打开文件数NR_OPEN,或者该句柄的文件结构指针为空,或者对应文件结构的i 节点字段为空,则出错if (fd >= NR_OPEN || !(f=current->filp[fd]) || !(inode=f->f_inode)) return -EBADF; cp_stat(inode,statbuf);// 复制文件状态信息 return 0;}
上一篇:open.c
下一篇:fcntl.c
登录 注册