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