关于标准c的select 11月 15th, 2007
不知道哪个哥们写得,从ir红外线设备获取数据居然轮询,搞得程序一起来CPU占用率就达到99%,哪怕什么也不做…
于是动手改成对设备的fd进行select,block至获取数据或超时
int select (int nfds, fd_set *read_fds, fd_set *write_fds, fd_set *except_fds, struct timeval *timeout)
结果发现:
- 设备一定要以block方式打开,即不能加O_NONBLOCK的mask
- fd_set在select返回时会变化,如果重新对同一个设备进行select,则需要重新调用FD_SET来加入fd到fd_set
不可能没学过的,居然一点印象都没有了…诶
其次, 后来发现select的另一个用途—sleep线程
在多线程程序里,在某个线程内调用sleep,usleep会导致整个程序的sleep,相信这个在大多数情况下都不是大家所期望的结果,那么你可以这样:
struct timeval timeout;
timeout.tv_sec = 1; /* 1s */
timeout.tv_usec = 0; /* 0 microsecond */
select (1, NULL, NULL, NULL, &timeout);
Leave a Reply
Recent Post
Recent Comments
- wayne:@Felix: 嗯...我倒是没什么要求, 就是拿来玩的,
- Felix Huang:@wayne en 始终是一分钱一分货 我对稳定性要求比较高
- wayne:@mattw: sandbox的自带style, 我还没空动
- wayne:@mattw: 反正留着也没用... @dimlau: 下
- Felix Huang:我还是一直用mediatemple的(gs)...... 呵
- dimlau:装的不像,没有我帅
- mattw:没到期你 cancel 个啥,留着做测试、做 tunnel
- westup:看你不断的折腾ING
- dimlau:哈哈,又换WP了
- wayne:@半瓶墨水: 不好意思, 从mt导入数据的时候换行被搞乱了