Chinaunix

标题: 新创建进程的时候,文件描述符表是什么时候清空的啊? [打印本页]

作者: zhangweijuan008    时间: 2015-04-03 15:22
标题: 新创建进程的时候,文件描述符表是什么时候清空的啊?
求助各位大神

最近在看文件描述符相关的问题,有一点想不通:
1、新建一个子进程的时候调用内核do_fork-->copy_process-->copy_files-->dup_fd,在dup_fd函数中对父进程的files_struct  files 结构体进行了完全复制,这样子进程就拥有和父进程一样的文件描述符表,此时子进程是可以对父进程打开的文件进行操作的;
2、然后子进程调用exec系列函数,函数最终掉用do_execve_common--->unshared_files-->unshared_fd-->dup_fd,在dup_fd函数中对子进程的files_struct  files 结构体进行了完全复制,也就是说调用exec系列函数之后抛弃了之前复制的父进程的files_struct结构,又生成了一个新的files_struct,但是仍然没有对文件描述符表的清空操作;

那么问题是:整个子进程创建过程中都没有对文件描述符表的清空操作吗?那么子进程即使调用了exec,还是可以打开父进程的文件啊?

而且子进程再申请文件描述符的时候,申请的fd不是从3开始,而是延续父进程的序号(好比父进程已经打开两个文件),返回fd= 5,这样应该不对吧?


求大牛指点!
作者: nswcfd    时间: 2015-04-07 09:41
应该不是吧,貌似是由FD_CLOEXEC来控制的。
作者: zhangweijuan008    时间: 2015-04-17 09:20
nswcfd 发表于 2015-04-07 09:41
应该不是吧,貌似是由FD_CLOEXEC来控制的。



谢谢,确实是这样




欢迎光临 Chinaunix (http://bbs.chinaunix.net/) Powered by Discuz! X3.2