2007-12-19   

这是一个比较简单的模块,从open.c中copy出来的.先看看task_struct 里有关文件的几个控制结构吧.
struct task_struct {
........
/* task state */
struct linux_binfmt *binfmt; /*elf aout ....*/
.....
int dumpable:1; /*是否可以core dump*/
/* limits */
char comm[16]; /*core dump的名称(可执行文件名)*/
/* file system info */
...
unsigned int locks; /* How many file locks are being held */
/* filesystem information */
struct fs_struct *fs;
/* open file information */
struct files_struct *files;
.....
};
struct files_struct {
atomic_t count;
rwlock_t file_lock;
int max_fds;
int max_fdset;
int next_fd;
struct file ** fd; /* current fd array,init is fd_arrary */
fd_set *close_on_exec;
fd_set *open_fds; /*bitmap for open fd_array*/
fd_set close_on_exec_init;
fd_set open_fds_init;
struct file * fd_array[NR_OPEN_DEFAULT]; /*inline的fd array*/
};

这里只关心files_struct. file_struct含有两个fd_set一个fd array(黑体和绿体字). 已开始fd指向fd_array,见
static int copy_files(unsigned long clone_flags, struct task_struct * tsk)
{
.....
newf->close_on_exec = &newf->close_on_exec_init;
newf->open_fds = &newf->open_fds_init;
newf->fd = &newf->fd_array[0];
...
}

之后需要扩展的时候.... 就是这个模块的事情了.
struct file ** alloc_fd_array(int num)
void free_fd_array(struct file **array, int num)
int expand_fd_array(struct files_struct *files, int nr)
fd_set * alloc_fdset(int num)
void free_fdset(fd_set *array, int num)
int expand_fdset(struct files_struct *files, int nr)

自己觉得没有必要每个函数分析了,就这四个函数....