linux 實現監聽熱插拔事件

2021-09-10 08:40:05 字數 2000 閱讀 4319

在一些跑linux 系統的平台上,比如故事機,會支援sdcard 熱插拔的功能,也就是在sdcard 插入後,把sdcard mount到檔案系統中,sdcard拔出後移除。上層應用要怎麼知道這個事件呢,應用層可以註冊監聽uevent 事件即可,下面給出對應的實現。

#include #include #include #include #include #include #include #include #include #include #define epoll_fd_size 3 //需要監聽的fd個數

#define epoll_event_size 2

#define epoll_timeout 1000 //等待的超時時間,1000ms 也就是1秒

#ifndef kernel_uevent_len

#define kernel_uevent_len (4*1024)

#endif

typedef struct

hotplug_context_t;

static hotplug_context_t hotplug = ;

static char uevent_buff[kernel_uevent_len];

static char card_node[32];

static int create_uevent_socket()

flags = fcntl(hotplug.uevent_fd, f_getfl, 0);

flags |= o_nonblock;

fcntl(hotplug.uevent_fd, f_setfl, flags);

struct sockaddr_nl src_addr;

memset(&src_addr, 0, sizeof(src_addr));

src_addr.nl_family = af_netlink;

src_addr.nl_pid = getpid();

src_addr.nl_groups = 0xffffffff;

retval = bind(hotplug.uevent_fd, (struct sockaddr*)&src_addr, sizeof(src_addr));

if(retval < 0)

return 0;

}static void destroy_uevent_socket()

}static void hotplug_parse_uevent(char* recv_buff,int recv_size)

hotplug_parse_uevent(uevent_buff,recv_size);}}

}hotplug.is_start = 0;

destroy_uevent_socket();

close(hotplug.epoll_fd);

return null;

}///

int start_hotplug_monitor()

hotplug.is_start = 1; //先標誌執行緒已經建立

if(pthread_create(&(hotplug.hotplug_thread), null, hotplug_thread_loop, null))

return 0;

}int stop_hotplug_monitor()

hotplug.is_running = 0; //讓執行緒結束

pthread_join(hotplug.hotplug_thread, null); //等待執行緒執行結束

return 0;

}​

這個流程還是比較簡單的,大概就是建立socket 連線,這不過最後乙個引數是netlink_kobject_uevent,然後繫結,然後用epoll 監聽socket 是否可讀(當然也可以用select實現),如果可讀了,就從socket 裡面讀取對應的資訊,重點在於讀取到這些資訊後怎麼解析,不同的平台傳遞的資訊內容可能不一樣,根據實際情況去解析就可以了。

QT 監聽USB熱插拔事件

過濾windows的事件訊息,其中wm devicechange是裝置發生變化時的windows發給各個程式的事件訊息,再通過wparam判斷是裝置插入 dbt devicearrival 還是拔出 dbt deviceremovecomplete 在qt中新增兩個檔案。usb listener.c...

監視熱插拔事件

include include include include include include include include include include static int init hotplug sock void set receive buffersize setsockopt ho...

Linux下實現USB口的熱插拔事件觸發

目前要做乙個在嵌入式平台上的usb口的熱插拔事件。經過我現在的分析總結目前有如下方法 此方法只能在pc上,但在嵌入式平台上不可用。使用netlink.include include include include include include include include include inc...