写串口程序接收数据时使用了select(fd+1,&readfds,&writefds,&exceptfds,NULL);

在接收线程里使用了select函数,还有另外一个线程有close(fd);即关闭串口

在调试过程中发现close之后,select函数仍然没有返回

后来查询资料得知,在socket编程中这样使用select是没问题的(如果是非正常断开,如意外断电,拔网线等情况,select也是无法检测到的);

因为在关闭socket时,你会接收到一条消息,所以select能返回;

但是在串口中,关闭端口是没有消息通知的,所以select无法知道,所以一直死在那,不会返回。

解决:

不使用select的无限等待模式,用等待超时;

struct timeval tv;

tv.tv_sec=5;

tv.tv_usec=0;

select(fd+1,&readfds,&writefds,&exceptfds,&tv);

如果哪位朋友有更好的解决方法请告知,谢谢

 

GitHub 加速计划 / li / linux-dash
10.39 K
1.2 K
下载
A beautiful web dashboard for Linux
最近提交(Master分支:2 个月前 )
186a802e added ecosystem file for PM2 4 年前
5def40a3 Add host customization support for the NodeJS version 4 年前
Logo

旨在为数千万中国开发者提供一个无缝且高效的云端环境,以支持学习、使用和贡献开源项目。

更多推荐