以下是do_sys_open
在kernel 3.12
版本的代码:
long do_sys_open(int dfd, const char __user *filename, int flags, umode_t mode)
{
struct open_flags op;
int fd = build_open_flags(flags, mode, &op);
struct filename *tmp;
if (fd)
return fd;
tmp = getname(filename);
if (IS_ERR(tmp))
return PTR_ERR(tmp);
fd = get_unused_fd_flags(flags);
if (fd >= 0) {
struct file *f = do_filp_open(dfd, tmp, &op);
if (IS_ERR(f)) {
put_unused_fd(fd);
fd = PTR_ERR(f);
} else {
fsnotify_open(f);
fd_install(fd, f);
}
}
putname(tmp);
return fd;
}
核心部分如下:
a)get_unused_fd_flags得到一个文件描述符;
b)do_filp_open得到一个struct file结构;
c)fd_install把文件描述符和struct file结构关联起来。
struct file
包含f_op
成员:
struct file {
......
const struct file_operations *f_op;
......
void *private_data;
......
}
而struct file_operations
又包含open
成员:
struct file_operations {
......
int (*open) (struct inode *, struct file *);
......
}
open
成员的两个参数:实际文件的inode
节点和struct file
结构。
在open
系统调用执行驱动中open
方法之前(struct file_operations
中的open
成员),会将private_data
置成NULL
,用户可以根据自己的需要设置private_data
的值(参考do_dentry_open
函数)。