中国IT动力,最新最全的IT技术教程
最新100篇 | 推荐100篇 | 专题100篇 | 排行榜 | 搜索 | 在线API文档 | 网通镜像
首 页 | 程序开发 | 操作系统 | 软件应用 | 图形图象 | 网络应用 | 精文荟萃 | 教育认证 | 硬件维护 | 未整理篇 | 站长教程
ASP JS PHP工程 ASP.NET 网站建设 UML J2EESUN .NET VC VB VFP 网络维护 数据库 DB2 SQL2000 Oracle Mysql
服务器 Win2000 Office C DreamWeaver FireWorks Flash PhotoShop 上网宝典 CorelDraw 协议大全 网络安全 微软认证
硬件维护  CPU  主板  硬盘  内存  显卡  显示器  键盘鼠标  声卡音箱  打印机  机箱电源  BIOS  网卡  C#  Java  Delphi  vs.net2005
  当前位置:> 程序开发 > 编程语言 > C/C++
select()的简单问题
作者:未知 时间:2005-09-13 19:24 出处:ChinaUnix.net 责编:chinaitpower
              摘要:select()的简单问题

select()函数作为I/O复用时,如果其超时值设为0,则立即返回,即处于polling模式,程序对select进行"轮询",一般认为这样会对性能有影响,请问,会有什么样的影响?我做了试验,我把超时值设为1秒,我发现这两种情况下程序的速度没什么变化,那么到底超时值为0对程序会有什么样的影响?为什么设定一个超时值就可以避免对CPU时间的浪费呢?谢谢!

 minsky 回复于:2003-08-09 11:11:14
怎么没人回复我啊?55555555555~~

 gadfly 回复于:2003-08-10 10:10:52
如果你的进程不停的接到数据,当然就看不出区别了。都马上返回

如果不忙的话,你不停的轮询一直占用cpu。而设置超时,在等待的时候,
进程阻塞,cpu资源就可以空闲给其它的进程用了。

 fls 回复于:2003-08-10 14:18:42
select如果处于轮询状态,就相当于不停的在问“有数据了吗?”,你的程序可是要靠cpu来运行的;而处于阻塞状态的时候,就相当于睡觉,有数据的时候,其它“人”会告诉它“喂,数据来了,快处理吧”,你的select就返回了,ok?

 flw 回复于:2003-08-10 16:47:22
[quote:30df4d2903="fls"]select如果处于轮询状态,就相当于不停的在问“有数据了吗?”,你的程序可是要靠cpu来运行的;而处于阻塞状态的时候,就相当于睡觉,有数据的时候,其它“人”会告诉它“喂,数据来了,快处理吧”,你的select就返?.........[/quote:30df4d2903]
好!形象!就冲这段话,马上置成“精彩回帖”。

 minsky 回复于:2003-08-12 09:27:59
两位回答的非常精彩 ,谢谢 :D

 minsky 回复于:2003-08-12 09:33:16
[quote:bca6b0aedc="flw"]
好!形象!就冲这段话,马上置成“精彩回帖”。[/quote:bca6b0aedc]     
嗯!同意

 victorxiang 回复于:2003-08-12 09:41:46
我也明白了,谢谢!

 minsky 回复于:2003-08-12 10:19:45
新问题又来了:)
如果在单任务系统中,上述问题可能会影响系统的性能;但:
如果我用的是多任务的操作系统,它肯定是按照时间片来分配任务的,也就是一段时间内只能有一个任务在跑,如果select()超时值设为0的话,立即返回,把CPU时间交给了别的任务,这样反而对性能有提高??迷惑中...望大虾指导!

 蓝色键盘 回复于:2003-08-12 18:41:14
如果你觉得select或者poll影响了性能。

那么采用其它的方式吧。

 mills 回复于:2003-08-30 23:04:31
null吧可以吗

 mills 回复于:2003-08-30 23:05:41
null吧可以吗

 tanchanghe 回复于:2004-02-25 14:10:55
用NULL的时候,表示socket一直处于阻塞状态(永远不会发生超时),这时除非套接字可读或者可写的时候才会返回,你就不能应用超时机制来控制程序了,如果这时你要控制程序,你必须要客户端发送数据来控制这个套接字

 llac 回复于:2004-06-07 15:32:12
我的问题:
假设开始时connect 是成功的,但是在循环处理接收数据时连接断了,此时
select()是否会一直在等待而不会有返回值?

 tanchanghe 回复于:2004-06-07 15:50:06
此时select会立即返回,但是此时你在受信的时候会返回0字节长

 llac 回复于:2004-06-07 16:18:59
实际情况是:
通过FTP接受文件,若有新文件则传送到AIX.
经常出现该进程被挂住,好像一直在睡觉。杀掉该进程重启,一切又正常。隔一段时间又出现该现象。通过跟踪发现执行到该函数就没有返回:
int get_ftp_data(int f_sock_id,FILE *fp,char *f_buffer,int f_recv_len)
{
    int hi,retu_value;
    fd_set readfs;
    struct timeval tv;
    int nfds,recv_number;

    FD_ZERO(&readfs);
    FD_SET(f_sock_id,&readfs);
    tv.tv_sec=45;
    tv.tv_usec=0;
    nfds=select(f_sock_id+1,&readfs,NULL,NULL,&tv);

    if (nfds==0)
    {
       return (-1);
    } else
    {
       if (FD_ISSET(f_sock_id,&readfs))
       {
          for(hi=0;hi<f_recv_len;hi++)
          {
                 *(f_buffer+hi)=0;
          }

          recv_number=fread(f_buffer,1,f_recv_len,fp);

          if(recv_number>=0)
          {
              return (recv_number);
          } else
          {
              return (-1);
          }
        }else
        {
            return (-1);
        }
    }
}

 tanchanghe 回复于:2004-06-07 16:48:24
tv.tv_sec=45; 
tv.tv_usec=0; 
nfds=select(f_sock_id+1,&readfs,NULL,NULL,&tv);

该select语句在f_sock_id不可读的时候, 会有45秒延迟, 你尝试将时间设置小一点看看

 llac 回复于:2004-06-07 16:57:32
实际情况时半小时会有个新文件。
问题是等了好几个小时都没有处理,进程重启后一下会接收好几个文件。

 tanchanghe 回复于:2004-06-07 17:31:22
没有发现其他地方会引起这个错误, 你看看其他地方有没有影响这个进程
或则,你调试进取看看你一条语句挂起

关闭本页
 
首页 | 投资与合作 | 服务条款 | 隐私政策 | 收藏本站 | 设为首页 | 新用户注册 | 免责声明 | 使用帮助
Copyright ©2005-2008 chinaitpower.com All rights reserved. www.chinaitpower.com 版权所有