| 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
|
没有发现其他地方会引起这个错误, 你看看其他地方有没有影响这个进程
或则,你调试进取看看你一条语句挂起
|