免费注册 查看新帖 |

Chinaunix

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

[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 16:53 |只看该作者
好像ftp这些服务器一般用fork比较好的~

论坛徽章:
0
3 [报告]
发表于 2011-02-18 17:55 |只看该作者
用进程服务比线程服务有好处:可使用不同的身份、便于使用信号、便于编码、有利于SMP并发...
说到开销,线程当然快,但是这个经常不是问题

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

论坛徽章:
0
5 [报告]
发表于 2011-02-18 21:33 |只看该作者
两次fork让父进程结束,好让init接管

论坛徽章:
0
6 [报告]
发表于 2011-02-20 10:39 |只看该作者
回复 5# bluewaterray


    终于明白了,谢谢

论坛徽章:
0
7 [报告]
发表于 2011-02-20 10:59 |只看该作者
两次fork是daemon进程…… 为了脱离 控制台……就是你所谓的后台运行…… 所以他的两个父进程都没用……所以 if(fork())exit(0);会有两次 google一下就知道

论坛徽章:
0
8 [报告]
发表于 2011-02-20 15:38 |只看该作者
chrome用多进程?

论坛徽章:
0
9 [报告]
发表于 2011-02-21 00:17 |只看该作者
没测试过 但感觉fork应该是比较消耗资源

毕竟做的工作比较复制

我一般是先fork出来几个进程  再竞争accept

论坛徽章:
0
10 [报告]
发表于 2011-02-22 10:44 |只看该作者
多进程的最大好处就是其中一个进程core掉也不会使业务完全中断,要是多线程的一旦core掉就杯具了。。。而且多线程的调试什么的都比较困难,且易出问题。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP