zhangweijuan008 发表于 2015-04-03 15:22

新创建进程的时候,文件描述符表是什么时候清空的啊?

求助各位大神

最近在看文件描述符相关的问题,有一点想不通:
1、新建一个子进程的时候调用内核do_fork-->copy_process-->copy_files-->dup_fd,在dup_fd函数中对父进程的files_structfiles 结构体进行了完全复制,这样子进程就拥有和父进程一样的文件描述符表,此时子进程是可以对父进程打开的文件进行操作的;
2、然后子进程调用exec系列函数,函数最终掉用do_execve_common--->unshared_files-->unshared_fd-->dup_fd,在dup_fd函数中对子进程的files_structfiles 结构体进行了完全复制,也就是说调用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 static/image/common/back.gif
应该不是吧,貌似是由FD_CLOEXEC来控制的。


谢谢,确实是这样
页: [1]
查看完整版本: 新创建进程的时候,文件描述符表是什么时候清空的啊?