当前位置: 技术问答>linux和unix
select函数有些不明白
来源: 互联网 发布时间:2016-09-14
本文导语: FD_ZERO(&readfds); FD_SET(fd1, &readfds); FD_SET(fd2, &readfds); timeout.tv_sec = atoi(argv[3]); timeout.tv_usec = 0; retval = select(maxfd, &readfds, NULL, NULL, &timeout); if (retval == -1) { oops("select", 4); } if (retval > 0) { if (FD_ISSET(fd1,...
FD_ZERO(&readfds);
FD_SET(fd1, &readfds);
FD_SET(fd2, &readfds);
timeout.tv_sec = atoi(argv[3]);
timeout.tv_usec = 0;
retval = select(maxfd, &readfds, NULL, NULL, &timeout);
if (retval == -1)
{
oops("select", 4);
}
if (retval > 0)
{
if (FD_ISSET(fd1, &readfds))
{
showdata(argv[1], fd1);
}
if (FD_ISSET(fd2, &readfds))
{
showdata(argv[2], fd2);
}
}
else
{
printf("no input after %d secondsn", atoi(argv[3]));
}
我这个是监听两个描述符,我的问题是,select如果发现一个描述目活动,然后就返回,开始执行某个showdata()
那在showdata没执行完时,另一个描述目又来了怎么办阿?
阻塞知道下次在select?我是菜鸟,翻了几本书,网上也查了查,还是不怎么懂阿
|
那就只能等待下一次select了
一般都是这么写的
while (1) {
fd = select(...);
if (...) ...
}
一般都是这么写的
while (1) {
fd = select(...);
if (...) ...
}
|
如果showdata需要很长时间去处理,可以fork一个进程去处理啊!
|
另一个描述符是否准备好与当前执行的代码没关系,仅与下一次调用select有关,你下一次再调用,它就直接返回了。
|
你将select放到while(1){}里,然后在下一个循环里,select立即就会检测到另一个描述符,如果你检测到后却不处理的话,在每次进入循环后select都提示另一个描述符有数据,直到处理掉为止。
|
把select放在循环里面哈。我们调用select的目的并不是去阻塞,而是去看看fdset状态有没有发生变化。
很多情况下,当我们调用select之前,fdset的状态已经发生了变化,也就是fdset在我们调用select之前就
发生了变化。
很多情况下,当我们调用select之前,fdset的状态已经发生了变化,也就是fdset在我们调用select之前就
发生了变化。
|
把select 放到一个while循环里面吧,这样当showdata处理完后就进入下一个循环,继续判断是否有新的文件描述符已经就绪
|
一般而言,select/poll/epoll函数只是一个代理,当检测到某个描述符就绪后.会独立出一个线程或者fork一个进程去处理这个数据
|
得看情况,如果数据处理耗费时间很短,在新的线程/进程中处理,反而性能更低,即使使用了线程/进程池技术.