新创建进程的时候,文件描述符表是什么时候清空的啊?
求助各位大神最近在看文件描述符相关的问题,有一点想不通:
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,这样应该不对吧?
求大牛指点! 应该不是吧,貌似是由FD_CLOEXEC来控制的。 nswcfd 发表于 2015-04-07 09:41 static/image/common/back.gif
应该不是吧,貌似是由FD_CLOEXEC来控制的。
谢谢,确实是这样
页:
[1]