找回密码
 立即注册
收起左侧

请教如何在linux环境下,在QT中判断U盘的热拔插

1
回复
9660
查看
[复制链接]
累计签到:2 天
连续签到:1 天
来源: 2021-7-30 10:46:58 显示全部楼层 |阅读模式
6Qter豆
qt版本5.12.

希望实现Linux下的U盘的检测,方便后续的文件拷贝,应该还需要附带卸载u盘.


请教各位大佬如何实现,查找方向,文章,示例都可以.
因为刚开始学linux,希望能够详细点.

搜索了多个地方的帖子,虽然找到些文章,但多个无法正常使用,或者无法理解.只好专门开问题求教.



回复

使用道具 举报

累计签到:2 天
连续签到:1 天
2021-8-2 15:58:28 显示全部楼层
  1. struct sockaddr_nl client;
  2.     struct timeval tv;
  3.     int CppLive, rcvlen, ret;
  4.     fd_set fds;
  5.     int buffersize = 1024;

  6.     CppLive = socket(AF_NETLINK, SOCK_RAW, NETLINK_KOBJECT_UEVENT);
  7.     memset(&client, 0, sizeof(client));

  8.     client.nl_family = AF_NETLINK;
  9.     client.nl_pid = getpid();
  10.     client.nl_groups = 1; /* receive broadcast message*/

  11.     setsockopt(CppLive, SOL_SOCKET, SO_RCVBUF, &buffersize, sizeof(buffersize));

  12.     bind(CppLive, (struct sockaddr*)&client, sizeof(client));

  13.     while (1) {
  14.         char buf[UEVENT_BUFFER_SIZE] = { 0 };
  15.         FD_ZERO(&fds);
  16.         FD_SET(CppLive, &fds);
  17.         tv.tv_sec = 0;
  18.         tv.tv_usec = 100 * 1000;
  19.         ret = select(CppLive + 1, &fds, NULL, NULL, &tv);
  20.         if(ret < 0)
  21.             continue;
  22.         if(!(ret > 0 && FD_ISSET(CppLive, &fds)))
  23.             continue;
  24.         /* receive data */
  25.         rcvlen = recv(CppLive, &buf, sizeof(buf), 0);
  26.         if (rcvlen > 0) {
  27.             emit EventMsg(buf);
  28.             /*You can do something here to make the program more perfect!!!*/
  29.         }
  30.     }
  31.     close(CppLive);
复制代码

按照查到的其他帖子,再qt中写了一个线程moveToThread,运行上述程序,希望能再插入U盘时候能获得信号.
按照qDebug提示线程正常运行,但实际试了下没任何反应.
请问有没哪位大佬能给出可能出问题的方向?
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

公告
可以关注我们的微信公众号yafeilinux_friends获取最新动态,或者加入QQ会员群进行交流:190741849、186601429(已满) 我知道了