免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12
最近访问板块 发新帖
楼主: 皇家救星
打印 上一主题 下一主题

关于fork的问题 [复制链接]

论坛徽章:
0
11 [报告]
发表于 2009-02-23 11:06 |只看该作者

回复 #9 cobras 的帖子

是的,结束一个进程,该进程的描述符将全部被关闭,但仅限于描述符,描述符描述的是什么?是资源。上面有人提到“引用数”的概念,只要有描述符引用了这块资源,那么资源就不被释放,直到所有描述该资源的描述符都被关闭为止。顺便一提:在同一个进程中复制描述符可以用 dup() 和 dup2()。

论坛徽章:
0
12 [报告]
发表于 2009-02-23 11:31 |只看该作者
主进程打开sorcket连接,fork后子进程将该连接断开,会不会影响父进程

一般情况下,如果子进程不需要用到的文件描述符(包括套接字),在开始的时候代码里都会把他们close掉, 但是父进程还可以正常使用他们

论坛徽章:
2
2015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:56:11
13 [报告]
发表于 2009-02-23 11:35 |只看该作者
我所理解的近似于文件系统内核的代码



  1. struct file { /* shared within processes */
  2.     int counter;
  3.     ... ....
  4. };

  5. struct pcb { /* process private */
  6.     struct file *fd[16];
  7. };

  8. int get_free_fd(struct pcb *p)
  9. {
  10.     int i;

  11.     for (i = 0; i < 16; i++) {
  12.         if (p->fd[i] == NULL) {
  13.             return i;
  14.         }
  15.     }
  16.     return -1;
  17. }

  18. int dup(struct pcb *p, int i)
  19. {
  20.     int new_fd;

  21.     new_fd = get_free_fd(p);
  22.     if (new_fd >= 0) {
  23.         ++p->fd[i]->counter;
  24.         p->fd[new_fd] == p->fd[i];
  25.         return new_fd;
  26.     }
  27.     return -1;
  28. }

  29. int close(struct pcb *p, int i)
  30. {
  31.     struct file *fp;

  32.     fp = p->fd[i];
  33.     if (fp != NULL && fp->counter > 0) {
  34.         if (--fp->counter == 0) {
  35.             close_file(fp);
  36.             free_file(fp);
  37.         }
  38.         p->fd[i] = NULL;
  39.         return 0;
  40.     }
  41.     return -1;
  42. }

  43. int close_all(struct pcb *p)
  44. {
  45.     int i;

  46.     for (i = 0; i < 16; i++) {
  47.         if (p->fd[i] != NULL) {
  48.              close(p, i);
  49.              p->fd[i] = NULL;
  50.         }
  51.     }
  52.     return 0;
  53. }

复制代码

论坛徽章:
2
2015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:56:11
14 [报告]
发表于 2009-02-23 11:51 |只看该作者

  1. int fork(struct pcb *p, const struct pcb *ps)
  2. {
  3.     int i;

  4.     *p = *ps;
  5.     ... ...
  6.     for (i = 0; i < 16; i++) {
  7.         if (p->fd[i] != NULL) {
  8.             ++p->fd[i]->counter;
  9.         }
  10.     }
  11.     ... ...
  12.     return 0;   
  13. }
复制代码

论坛徽章:
0
15 [报告]
发表于 2009-02-23 17:35 |只看该作者
谢谢各位的回答 现在比以前明白了一些
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP