当前位置:  技术问答>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 (...) ...
}

|
如果showdata需要很长时间去处理,可以fork一个进程去处理啊!

|
另一个描述符是否准备好与当前执行的代码没关系,仅与下一次调用select有关,你下一次再调用,它就直接返回了。

|
你将select放到while(1){}里,然后在下一个循环里,select立即就会检测到另一个描述符,如果你检测到后却不处理的话,在每次进入循环后select都提示另一个描述符有数据,直到处理掉为止。

|
把select放在循环里面哈。我们调用select的目的并不是去阻塞,而是去看看fdset状态有没有发生变化。

很多情况下,当我们调用select之前,fdset的状态已经发生了变化,也就是fdset在我们调用select之前就

发生了变化。

|
把select 放到一个while循环里面吧,这样当showdata处理完后就进入下一个循环,继续判断是否有新的文件描述符已经就绪

|
一般而言,select/poll/epoll函数只是一个代理,当检测到某个描述符就绪后.会独立出一个线程或者fork一个进程去处理这个数据

|


得看情况,如果数据处理耗费时间很短,在新的线程/进程中处理,反而性能更低,即使使用了线程/进程池技术.

    
 
 

您可能感兴趣的文章:

  • Select和listen函数的区别
  • select函数。
  • 请教select函数
  • 秒爆,求教育,求解释,linux 的select()函数
  • 关于select函数返回错误的处理
  • select函数的问题
  • win32下的select函数可以监听文件句柄吗?
  • select连接问题~ 有点一直搞不明白~ iis7站长之家
  • select函数
  • 请教套接字中的select()函数问题
  • Linux 中 select 函数问题 !!!!!!!!!!!!!!
  • 请问使用SELECT()函数怎么监测串口发送数据?
  • 关于Select()函数。
  • 关于select函数中struct timeval问题
  • 关于select函数
  • 关于select()函数的用法
  • select函数的作用是什么呢?谢谢
  • 我做了个socket服务器,但是客户端接收数据的时候用select()函数????可接受不到
  • select函数疑问
  • 为什么作了信号处理之后select函数就不能正常工作了?
  • select连接问题~ 有点一直搞不明白~
  •  
    本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
    本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • java命名空间javax.accessibility类accessiblestate的类成员方法: selected定义及介绍
  • 究竟怎么样取得的<select name="select_user" size="8" multiple>值
  • java命名空间javax.accessibility类accessiblestate的类成员方法: selectable定义及介绍
  • man select 结果返回 No manual entry for select
  • java命名空间javax.swing.tree类defaulttreeselectionmodel的类成员方法: selection定义及介绍
  • select <0时调用exit(0),为什么程序没有退出,而是继续执行select了?
  • java命名空间javax.swing.tree类defaulttreecellrenderer的类成员方法: selected定义及介绍
  • insert into select和select into的使用和区别介绍
  • java命名空间java.awt.event类itemevent的类成员方法: selected定义及介绍
  • select+read 读服务器发送过来的数据, 假设服务器调用close后, 客户端的select是否返回这个socket可读?
  • java命名空间javax.swing类defaultbuttonmodel的类成员方法: selected定义及介绍
  • JDBC里select sum和select返回的字段类型不一样
  • java命名空间javax.swing.text.html类html.tag的类成员方法: select定义及介绍
  • sql代码:select database select all table
  • java命名空间javax.swing.text.html类html.attribute的类成员方法: selected定义及介绍
  • Oracle中select 1和select *的区别
  • java命名空间javax.swing.plaf.synth接口synthconstants的类成员方法: selected定义及介绍
  • jquery下拉select控件操作方法分享(jquery操作select)
  • java命名空间javax.sound.midi类shortmessage的类成员方法: song_select定义及介绍
  • INSERT INTO SELECT语句与SELECT INTO FROM语句的一些区别
  • java命名空间javax.swing类jfilechooser的类成员方法: cancel_selection定义及介绍
  • select into 和 insert into select 两种表复制语句


  • 站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,,E-mail:www_#163.com(请将#改为@)

    浙ICP备11055608号-3