日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > linux >内容正文

linux

Linux下实现USB口的热插拔

發布時間:2025/3/15 linux 20 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Linux下实现USB口的热插拔 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

目前要做一個在嵌入式平臺上的USB口的熱插拔事件。

經過我現在的分析總結目前有如下方法:

1,定時檢查/proc/scsi/scsi文件

此方法只能在PC上,但在嵌入式平臺上不可用。

2,netlink方式

使用netlink.

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
#include <sys/un.h>
#include <sys/ioctl.h>
#include <sys/socket.h>
#include <linux/types.h>
#include <linux/netlink.h>
#include <errno.h>
#include <unistd.h>
#include <arpa/inet.h>
#include <netinet/in.h>

#define UEVENT_BUFFER_SIZE 2048

static int init_hotplug_sock()
{
? const int buffersize = 1024;
? int ret;

? struct sockaddr_nl snl;
? bzero(&snl, sizeof(struct sockaddr_nl));
? snl.nl_family = AF_NETLINK;
? snl.nl_pid = getpid();
? snl.nl_groups = 1;

? int s = socket(PF_NETLINK, SOCK_DGRAM, NETLINK_KOBJECT_UEVENT);
? if (s == -1)
? {
??????? perror("socket");
??????? return -1;
? }
? setsockopt(s, SOL_SOCKET, SO_RCVBUF, &buffersize, sizeof(buffersize));

? ret = bind(s, (struct sockaddr *)&snl, sizeof(struct sockaddr_nl));
? if (ret < 0)
? {
??????? perror("bind");
??????? close(s);
??????? return -1;
? }

? return s;
}

int main(int argc, char* argv[])
{
? int hotplug_sock = init_hotplug_sock();

? while(1)
? {
????? /* Netlink message buffer */
????? char buf[UEVENT_BUFFER_SIZE * 2] = {0};
????? recv(hotplug_sock, &buf, sizeof(buf), 0);
????? printf("%s\n", buf);

???? /* USB 設備的插拔會出現字符信息,通過比較不同的信息確定特定設備的插拔,在這添加比較代碼 */
? }
? return 0;

}

經過測試發現只能實現插與拔,但是無法具體到具體是什么設備。

3,使用mdev。

此方法相當麻煩,現在在研究中。

4,使用最原始的解析文件方式

此方法相當麻煩,生成很多文件。

就是用cat /proc/bus/usb/devices的信息生成的文件進行解析。

目前我已經完成此功能。雖然能用,但是效率太低。


轉自:?http://www.linuxidc.com/Linux/2011-12/49112.htm

總結

以上是生活随笔為你收集整理的Linux下实现USB口的热插拔的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。