免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 10555 | 回复: 6
打印 上一主题 下一主题

[其它] Linux程序如何知道USB设备已插入? [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2015-05-19 16:21 |只看该作者 |倒序浏览
本帖最后由 xylinux6 于 2015-05-19 16:22 编辑

Hello, 我是Linux菜鸟 , 理解不对的地方希望大家指导一二,谢谢。
在我现有的linux系统上,插入usb打印机会提示打印机接入的信息,比如挂载到了usblp0下。
怎样才能让我的程序知道这个插入事件呢?比如有个小函数,每当插入USB设备时,函数被调用并输出一段信息:
  1. void fun()
  2. {
  3.   printf("USB plugs in.\n");
  4. }
复制代码
看到有朋友说可以利用while循环检测,但应该还有更好的办法吧。怎么实现呢?或者我应该去了解哪方面的知识呢?
多谢!

论坛徽章:
1
15-16赛季CBA联赛之新疆
日期:2017-03-09 12:33:45
2 [报告]
发表于 2015-05-20 17:56 |只看该作者
回复 1# xylinux6


    你看一下这个如何探测USB,在FREEBSD下面LINUX与这个思路是大致相似的,只是名字有一点变化。

论坛徽章:
0
3 [报告]
发表于 2015-06-01 11:12 |只看该作者
回复 2# jeppeter
多谢回复。
不过那个文章看起来有些费力。


   

论坛徽章:
0
4 [报告]
发表于 2015-06-09 10:20 |只看该作者
在网上找了些,在没有更理想的方案之前、实时性不高的前提下,暂时用CPU轮询的方式可以实现。
思路:当有USB打印机插入到ARM板上时,/sys/class/usb/lp0文件会被自动生成;当拔出打印机时,文件相应地被删除。因此可以创建一个线程每隔5s查询这个文件lp0是否存在。
实现:这种方法缺陷有二,对于嵌入式来讲有些浪费CPU,这是其一;其二,由于是隔一段时间T才扫描,当用户在T时间内拔掉并重新插上另一个打印机时,有可能被认为lp0仍然是原来的打印机,而非新插入的打印机。不过对于我的实际情况这个拙劣的方法还是可以忍受的。希望有朋友提出更好的方案。
  1. void* monitor(void *arg)  /* 监视USB打印机是否接入 */
  2. {
  3.     while(1)
  4.     {
  5.         while(lp0存在)
  6.         {
  7.              printf("打印机已接入.\n");
  8.              sleep(5);  /* 每隔5秒检查一次lp0文件是否存在 */
  9.         }
  10.         printf("打印机已拔出.\n");
  11.         sleep(5);  /* 每隔5秒检查一次lp0文件是否存在 */
  12.     }
  13. }

  14. int main()
  15. {
  16.         pthread_t tid;
  17.         if (pthread_create(&tid, NULL, monitor, NULL))  /* 创建一个线程,用来监视USB打印机的接入/拔出 */
  18.         {
  19.                 printf("cannot create a thread in the calling process.\n");
  20.                 exit(0);
  21.         }
  22.         while(1);  /* 此时main线程与monitor线程并发运行 */
  23.         return 0;
  24. }
复制代码

论坛徽章:
0
5 [报告]
发表于 2015-07-23 15:37 |只看该作者
回复 4# xylinux6

自己帮了自己。后来用的方法并不能很好的检测,这个办法的确好用。

   

论坛徽章:
0
6 [报告]
发表于 2015-07-31 08:17 |只看该作者
赞,我也是新手,循环检测用的opendir()?别的方法是不是就得改驱动了?

论坛徽章:
0
7 [报告]
发表于 2015-07-31 09:54 |只看该作者
本帖最后由 xlb7679 于 2015-07-31 10:07 编辑

倒是想到了一个新的方法:dmesg | grep -i usb  可以打印关于系统内核对usb的系统打印,程序写个system调用shell命令捕捉关于插拔的信息,不过还是得轮询;怎么才能实现阻塞的异步通知呢?在驱动层打印插拔的部分将信息输入到文件,然后在应用层对该文件阻塞读取,这样感觉更麻烦啊,usb这种有架构的驱动就够我喝一壶了
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP