免费注册 查看新帖 |

Chinaunix

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

[C] 服务器每次为何fork [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2011-02-18 16:37 |显示全部楼层 |倒序浏览
在循环中处理事务,每次开启一个进程或者线程,处理后,将子进程关闭(进程),或者线程退出。
但是这样比较耗费资源,于是有了线程池来创建和回收。

疑问是,为何一些服务器会不停的forek() 子进程,比如下面:
  1. for(;;)
  2.     {
  3.         if ( (connfd = accept(sockfd, (struct sockaddr *)&cliaddr, &cliaddr_len)) == -1 )
  4.         {
  5.             if (errno == EAGAIN || errno == EWOULDBLOCK)
  6.                 ;
  7.             else
  8.                 perror("accept error");
  9.             continue;
  10.         }

  11.         if (fork() == 0)
  12.         {
  13.                 if (recv(connfd, buff, MAXLEN, 0) == -1)
  14.                 {
  15.                     perror("recv error");
  16.                     close(connfd);
  17.                     exit(0);
  18.                 }
  19.         }

  20.         if (close(connfd) == -1)
  21.         {
  22.             perror("close error");
  23.             continue;
  24.         }

  25.         waitpid(-1, NULL, WNOHANG);
  26.     }
复制代码
1.这样的资源耗费高吗?(当然我们可以用select或者epoll,这只是一个例子)

2.一些启动于后台的程序也是if (fork()) exit(0); 这么做又是为什么呢?搞不懂,还望指教。

谢谢

论坛徽章:
0
2 [报告]
发表于 2011-02-18 19:39 |显示全部楼层
谢谢各位朋友的热心回复。
fork有自己的优点,比如chrome就不会出现卡死的问题。
还有就是维护一个进程/线程 所减少的开销 和 不停创建进程/线程 所带来好处对比之后决定怎样的方法适合在程序里使用。

论坛徽章:
0
3 [报告]
发表于 2011-02-20 10:39 |显示全部楼层
回复 5# bluewaterray


    终于明白了,谢谢
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP