免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 3010 | 回复: 3
打印 上一主题 下一主题

调用fork(2)后的文件描述符表 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2009-01-20 14:42 |只看该作者 |倒序浏览
task_struct的files中包含了当前进程打开的文件描述符表,在kernel/fork.c中的do_fork()调用之后,如果没有设置CLONE_FILES标志,会在子进程中生成一个新的files,否则会直接使用父进程的files,我不清楚的地方是:
1) 是不是只有clone(2)才设置CLONE_FILES标志, 调用fork(2)会不会设置CLONE_FILES标志?
2) 如果设置CLONE_FILES标志, 子进程(或线程)打开的新的文件描述符会不会影响父进程的文件描述符表内容?
3) 不管是否设置CLONE_FILES标志, 从父进程继承的文件描述符refcount值是不是应该加1, 比如父进程在调用do_fork()之前打开了一个文件描述符3(refcount=1), 这时子进程生成之后,描述符3的refcount是否为2?

望高人指点!谢谢!

论坛徽章:
0
2 [报告]
发表于 2009-01-20 15:29 |只看该作者
原帖由 ljshan 于 2009-1-20 14:42 发表
task_struct的files中包含了当前进程打开的文件描述符表,在kernel/fork.c中的do_fork()调用之后,如果没有设置CLONE_FILES标志,会在子进程中生成一个新的files,否则会直接使用父进程的files,我不清楚的地方 ...


你这个地方说的文件描述表应该是指task_struct结构体中的files_struct吧?

1. clone(2)中的clone_flags标志位是根据进程的栈中的ebx寄存器来设置的。这就要看是怎样去调用这个clone了。一般地,pthread_create创建一个新线程,会共享整个进程的file_struct,而fork则没有设置这个标志位,也就是说,fork出的子进程,与父进程有不同的files_struct。

2. 如果设置了CLONE_FILES,子进程打开文件会影响父进程的file_struct。因为此时父子进程的task_struct中的files域均指向同一个files_struct。

3. 如果是设置了CLONE_FILES,则只会增加file_struct->count的引用计数,而如果没有设置CLONE_FILES,则会增加每个打开的文件的file->f_count计数。


在copy_files中,有下面这段代码:

  1.         if (clone_flags & CLONE_FILES) {
  2.                 atomic_inc(&oldf->count);
  3.                 goto out;
  4.         }
复制代码


如果没有设置CLONE_FILES
则会调用dup_fd,进而:

  1.         for (i = open_files; i != 0; i--) {
  2.                 struct file *f = *old_fds++;
  3.                 if (f) {
  4.                         get_file(f);
  5.                 }
复制代码


增加每一个打开的文件的引用计数。

更多的资料,可以看看《情景分析》第四章,创建进程部分。

[ 本帖最后由 scutan 于 2009-1-20 15:31 编辑 ]

论坛徽章:
0
3 [报告]
发表于 2009-01-20 16:06 |只看该作者
解释得好清楚,非常感谢!!!

论坛徽章:
0
4 [报告]
发表于 2009-01-20 16:21 |只看该作者
原帖由 ljshan 于 2009-1-20 16:06 发表
解释得好清楚,非常感谢!!!


不用客气,欢迎多多交流!
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP