一撇一捺 发表于 2018-5-12 21:27:09 | 显示全部楼层 |阅读模式
本帖最后由 一撇一捺 于 2018-5-17 16:05 编辑

在嵌入式开发板上(Linux+qt),如今想要实现这一一功能,插入U盘能及时自动检测到并能读取U盘内文件的数据进行下一步的操作。由于对USB hotpliug不了解,所以我用了最笨的方法利用一定时器和信号槽定时周期检查/dev/sda1设备节点的存在与否来判断有没有U盘插入,部分代码如下:                sprintf(temp,"fdisk -l");
                stream = popen(temp, "r"); //通过popen执行命令fdisk -l 通过管道取(“r”参数)到FILE* stream

                while(fgets(buf, sizeof(buf), stream)!=NULL)   //将流文件内容获取到buf内
                {  
                        if(!strncmp(buf,"/dev",4))
                        {   
                                sscanf(buf,"/dev/sd%c%d:",&stt,&usb_index);

                                memset(temp,0,sizeof(temp));
                                sprintf(temp,"sd%c",stt);
                                
                                if(stt=='a')//index==1)
                                {
                                        usb=stt;  
                                        break;
                                }
                                index++;
                        
                        }
                }

                .......
              红色代码居然返回了空,蓝色代码buf里面获取到的内容也是空了,但我手动在命令行下执行fdisk -l时是很正常显示一些内容的,为什么这里利用popen函数就执行不了呢?不知道各位遇到过这种情况没有,或者有更好的办法来达到同样的功能(自动识别出U盘)?希望能得到大家的指教,谢谢!
 楼主| 一撇一捺 发表于 5 天前 | 显示全部楼层
后期经过改善,程序能正常读到U盘,目前检测并读取U盘的方法我能找到的大概三种,其一,读取对应路径有没有生成相应的文件判断,如/system/class/block/sda等等;其二利用netlink方式,这是一种特殊的socket,当U盘热插拔时,内核会发送消息给HAL层,通过接收目标消息来判断;其三,开源项目libusb。第一种最简单且不耗时,第二种耗时性比第一种差,第三种没试过。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|Archiver|天嵌计算机科技 ( 粤ICP备11094220号 )

GMT+8, 2018-5-22 06:21 , Processed in 0.166524 second(s), 17 queries .

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

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