免费注册 查看新帖 |

Chinaunix

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

[驱动] 应用程序如何得知U盘插入 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2010-12-10 14:00 |只看该作者 |倒序浏览
我在9260上跑Linux2.6.24的内核,插入u盘后能提示信息,然后在超级终端下我可以挂载u盘,对u盘进行操作。我的应用程序可以通过查询/proc/partitions查看当前有没有u盘插入。现在的问题是,我不想通过查询的办法,而让驱动层自动通知到应用程序现在有u盘插入了,有没有这样的一种机制?我知道可以在驱动里面发送信号,除此之外还有没有别的办法?

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
2 [报告]
发表于 2010-12-11 23:53 |只看该作者
用一个脚本吧。测试那个挂载的文件存在了。就执行一些动作。

论坛徽章:
0
3 [报告]
发表于 2010-12-12 12:20 |只看该作者
用hotplug技术就可以了, 应用层可以监听netlink的信息, 然后自己实现过滤, 那么系统有什么事件都能捕捉到了。

论坛徽章:
0
4 [报告]
发表于 2010-12-12 20:38 |只看该作者
编译内核使其支持热插拔

论坛徽章:
5
摩羯座
日期:2014-07-22 09:03:552015元宵节徽章
日期:2015-03-06 15:50:392015亚冠之大阪钢巴
日期:2015-06-12 16:01:352015年中国系统架构师大会
日期:2015-06-29 16:11:2815-16赛季CBA联赛之四川
日期:2018-12-17 14:10:21
5 [报告]
发表于 2010-12-12 21:59 |只看该作者
uevent

论坛徽章:
0
6 [报告]
发表于 2010-12-13 14:34 |只看该作者
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4. #include <ctype.h>
  5. #include <sys/un.h>
  6. #include <sys/ioctl.h>
  7. #include <sys/socket.h>
  8. #include <linux/types.h>
  9. #include <linux/netlink.h>
  10. #include <errno.h>
  11.   static int
  12. init_hotplug_sock (void)
  13. {

  14.   struct sockaddr_nl snl;

  15.   const int buffersize = 16 * 1024 * 1024;

  16.   int retval;

  17.   memset(&snl, 0x00, sizeof (struct sockaddr_nl));

  18.   snl.nl_family = AF_NETLINK;

  19.   snl.nl_pid = getpid ();

  20.   snl.nl_groups = 1;

  21.   int hotplug_sock = socket (PF_NETLINK, SOCK_DGRAM, NETLINK_KOBJECT_UEVENT);

  22.   if (hotplug_sock == -1)
  23.     {

  24.       printf ("error getting socket: %s", strerror (errno));

  25.       return -1;

  26.     }

  27.   /* set receive buffersize */

  28.   setsockopt (hotplug_sock, SOL_SOCKET, SO_RCVBUFFORCE, &buffersize,
  29.               sizeof (buffersize));

  30.   retval =
  31.     bind (hotplug_sock, (struct sockaddr *) &snl,
  32.           sizeof (struct sockaddr_nl));

  33.   if (retval < 0)
  34.     {

  35.       printf ("bind failed: %s", strerror (errno));

  36.       close (hotplug_sock);

  37.       hotplug_sock = -1;

  38.       return -1;

  39.     }

  40.   return hotplug_sock;

  41. }

  42. #define UEVENT_BUFFER_SIZE      2048

  43. int
  44. main (int argc, char *argv[])
  45. {

  46.   int hotplug_sock = init_hotplug_sock ();



  47.   while (1)

  48.     {

  49.       char buf[UEVENT_BUFFER_SIZE * 2] = { 0 };

  50.       recv (hotplug_sock, &buf, sizeof (buf), 0);

  51.       printf ("(debug)   %s\n", buf);

  52.     }

  53.   return 0;

  54. }
复制代码

评分

参与人数 1可用积分 +30 收起 理由
T-Bagwell + 30 精品文章

查看全部评分

论坛徽章:
0
7 [报告]
发表于 2011-07-04 17:40 |只看该作者
本帖最后由 c04n05 于 2011-07-20 18:32 编辑

hotplug已经废弃,我在这里给大家总结下新的实现。
现在用的是udev,需要修改/etc/udev/rules.d目录下的配置文件来实现,
例:KERNEL=="sdb", ACTION=="add", RUN+="/usr/bin/my_program"

对于mdev(BusyBox已带有一个简化版的udev,嵌入式设备貌似都用这个吧?)
修改配置文件 /etc/mdev.conf
格式:<device regex> <uid>:<gid> <octal permissions> [<@|$|*> <command>]
特殊字符意义:
@ 在创建设备节点后运行命令。
$ 在删除设备节点前运行命令。
* 在创建设备节点后和删除设备节点前都运行命令。
例:sd[a-z][0-9] 0:0 600 @(mkdir -p /usb/$MDEV&&mount /dev/$MDEV /usb/$MDEV)

评分

参与人数 1可用积分 +10 收起 理由
T-Bagwell + 10 精品文章

查看全部评分

论坛徽章:
0
8 [报告]
发表于 2011-08-07 10:32 |只看该作者
关注,学习

论坛徽章:
2
水瓶座
日期:2013-09-04 15:09:57白羊座
日期:2014-04-17 16:48:13
9 [报告]
发表于 2011-08-10 10:05 |只看该作者
完整的系统有udev、直接用busybox的mdev,都可以在设备插入/拔出的时候跑你自己定义的程序/脚本。

具体要看下这两个东西的配置文件怎么写。

论坛徽章:
0
10 [报告]
发表于 2012-02-09 16:12 |只看该作者
应用层实现,觉得还是hotplug好,udev适合自动挂卸载
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP