select函数,ioctl函数和tcflush函数问题

「已注销」 2011-09-27 04:36:46
1:当select函数返回值为0的时候,说明超出时间文件描述符没有数据可读写,但是不是依然要做处理子程序,因为我看到依然有些程序还会做处理(类似于selece函数大于0时候的数据处理),所以我不是很明白,底层驱动没有收到数据,也没有数据要写,为什么还要处理一次,很浪费程序的执行时间啊。
2:ioctl(fd,FIONREAD,&datalen)的返回值是返回了哪个地方的数据,是文件描述符里的吗?还是什么其他缓冲区里的?如果有下面一段程序:
if(ioctl(fd,FIONREAD,&datalen) < 0)
{
printf("");
}
if(datalen > 0) //这句话和if(ioctl(fd,FIONREAD,&datalen) > 0)是不是相同的作用,都是判断有等待要处理的数据?
{
......
}
3:我在用户空间定义buffer[1024],如果ioctl返回的数据大于1024,要怎么处理,我听有人说要用tcflush(fd,TCIOFLUSH),
我觉得不能这么做吧,那不是全都删除了!他们说这样写
if(datalen > 1024)
{
tcflush(fd,TCIOFLUSH);
ioctl(fd,FIONREAD,&datalen);
}
我就想如果都tcflush删除没了,还用ioctl获取什么啊?
请各位朋友帮忙指点下,小弟对这几个操作系统函数还不会使用。
...全文
455 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
「已注销」 2011-11-11
  • 打赏
  • 举报
回复
那输入输出缓冲区和fd对应的缓冲区有什么区别吗?
jiehui1008 2011-11-10
  • 打赏
  • 举报
回复 1
无意中搜到这个帖子,还是一个月以前的了,但是也想一起讨论讨论

1,你说的情况我没有遇到过,但是可以用FD_ISSET(&fd)来判断是否可读写

2,在我印象中ioctl函数返回值:成功为0,出错为-1;所以没有if(ioctl(fd,FIONREAD,&datalen) > 0)这种判断方法

3,ioctl的返回结果不可能大于1024,但是datalen 有可能,调用tcflush(fd,TCIOFLUSH);
只是清空了输入输出缓冲区的数据,跟fd对应的缓冲区没有联系吧

21,595

社区成员

发帖
与我相关
我的任务
社区描述
硬件/嵌入开发 驱动开发/核心开发
社区管理员
  • 驱动开发/核心开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧