日期:2014-05-16  浏览次数:20677 次

请问server中的fork有什么用?
while(1){
    accept_fd=accept(listen_fd,NULL,NULL);
    if((accept_fd<0)&&(errno==EINTR))
           continue;
    else if(accept_fd<0){
     perror("accept error.");
     continue;
}

   if(fork()==0){
    while(1){
     if((read_size=recv(accept_fd,buf,BUFFER_SIZE, 0))==-1) {
perror("recv error.");
exit(1);
}
if(!strcmp(buf, "end")){
break;
}
printf("Server received : \n%s\n",buf);
}

     close(listen_fd);
     close(accept_fd);
     exit(0);
    }
    else
    close(accept_fd);
}

上面是server服务端listen以后的代码。这里为什么要用fork呢?父进程什么也没干,为什么还需要单独在子进程中进程接受数据?我自己试验了开多个terminal,可以实现多个client输入到server中,去掉fork则不行。有没有人能麻烦解释一下这个fork在这里到底怎么工作的?
socket server fork 聊天 多client

------解决方案--------------------
去掉fork的话,程序会阻塞在recv上,其它客户再连上来的话就没有办法及时调用Accept来接受连接,当然会出问题。


------解决方案--------------------
有fork(),效果就是一个子进程对应一个客户端连接,互不影响,并发度高一些

这种策略是应对数据处理时间很长的情形,假定不产生子进程,那就是需要父进程自己接受客户端连接,并处理客户端的请求,在处理过程中,就不能接受新的客户端连接请求
------解决方案--------------------
上面 我只是大致写了select 的意思 ,你自己对应着写下就OK,五一我抽时间把select函数的用法以我的理解整理出来