天嵌 ARM开发社区

 找回密码
 注册
查看: 2461|回复: 5

led-player.c中的select的疑问

[复制链接]
friendpy 发表于 2012-3-15 15:08:48 | 显示全部楼层 |阅读模式
原程序是这样的
mian(void)
{ .....
  ......
for (;;) {
                fd_set rds;
                struct timeval step;
                int ret;

                FD_ZERO(&rds);
                FD_SET(led_control_pipe, &rds);
                step.tv_sec  = period;
                step.tv_usec = (period - step.tv_sec) * 1000000L;

                ret = select(led_control_pipe + 1, &rds, NULL, NULL, &step);
.....
.....

fd_set rds 这条语句在for 循环里面,就是说循环一次它就要执行一次,不断的声明rds,结果会怎么样呢。

select实际上是调用do_select函数的,但是control-gpio (EmbedSky_gpio.c) 驱动中没有.poll方法。就是说select怎么知道rds中有没有数据写入呢?
在EmbedSky_irp.c中有poll方法,那就是为select作准备的。

}
 楼主| friendpy 发表于 2012-3-15 15:36:42 | 显示全部楼层
本帖最后由 friendpy 于 2012-3-15 15:36 编辑

补充:

在do_select里,返回的是return retval 。

如果出错了,retval = max_select_fd(n, fds);会将retuval设定为<0,然后返回。
如果没有的话,retval=0,然后返回。
如果有数据写入。则在
if (file) {
     f_op = file->f_op;
     mask = DEFAULT_POLLMASK;
     if (f_op && f_op->poll)
      mask = (*f_op->poll)(file, retval ? NULL : wait);
     fput_light(file, fput_needed);
     if ((mask & POLLIN_SET) && (in & bit)) {
      res_in |= bit;
      retval++;
     }
     if ((mask & POLLOUT_SET) && (out & bit)) {
      res_out |= bit;
      retval++;
     }
     if ((mask & POLLEX_SET) && (ex & bit)) {
      res_ex |= bit;
      retval++;
     }
    }

这个里面会确定有没有数据写入,有的,会执行retval++.

对于led-player.c中的情况,它使用的驱动没有poll方法。
回复

使用道具 举报

 楼主| friendpy 发表于 2012-3-15 16:05:28 | 显示全部楼层
补充:
在do_select中
如没找不到poll
if (f_op && f_op->poll)
      mask = (*f_op->poll)(file, retval ? NULL : wait);
那行 if 后面的这段代码就不会执行。
那么:
      mask = DEFAULT_POLLMASK;



回复

使用道具 举报

亚瑟王 发表于 2012-3-15 18:26:24 | 显示全部楼层
friendpy 发表于 2012-3-15 16:05
补充:
在do_select中
如没找不到poll

亲,你看一下这个帖子的select函数的使用吧:http://apps.hi.baidu.com/share/detail/15812193
回复

使用道具 举报

 楼主| friendpy 发表于 2012-3-16 09:46:22 | 显示全部楼层
亚瑟王 发表于 2012-3-15 18:26
亲,你看一下这个帖子的select函数的使用吧:http://apps.hi.baidu.com/share/detail/15812193

谢谢亚瑟王。贴子我看了,基本明白了,还有几个小疑问,本人初学linux,基础不太好,见凉。

1 )  文件描述符是一个int型的整数,fd_set描述的结构是一个数组,数组中的元素就是文件描述符。这样理解对吗?

贴子中有这么一段:
FD_CLR(in fd,fd_set* set);用来清除描述词组set中相关fd 的位
FD_ISSET(int fd,fd_set *set);用来测试描述词组set中相关fd 的位是否为真
FD_SET(int fd,fd_set*set);用来设置描述词组set中相关fd的位
FD_ZERO(fd_set *set);用来清除描述词组set的全部位


比如说:用来请除描述词组set中相关fd的位,能举个例子说明一下吗:
比如
fd_set rdfds;
int sa=100;
int sb=102;
int sc=30;
FD_SET(sa, &rdfds);
FD_SET(sb, &rdfds);
FD_SET(sc, &rdfds);
2 )    这个时候rdfds会是什么状态呢?

然后再进行:FD_CLR(in sb,fd_set* set);
3)  这个时候rdfds又会是什么状态呢?

就因为对这个不懂,在读do_select函数的时候读不通。


回复

使用道具 举报

TQ_guoxixiao 发表于 2012-3-16 10:32:31 | 显示全部楼层
"2 )  这个时候rdfds会是什么状态呢?":分别把3个句柄加入读监视集合里去,是都加进入了。
“3 )  这个时候rdfds又会是什么状态呢”:清除描述词组set中相关fd 的位
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

i.MX8系列ARM cortex A53 M4 工控板上一条 /1 下一条

Archiver|手机版|小黑屋|天嵌 嵌入式开发社区 ( 粤ICP备11094220号-2 )

GMT+8, 2025-5-4 11:56 , Processed in 2.031288 second(s), 20 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表