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)
自己觉得没有必要每个函数分析了,就这四个函数....
|