欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 文旅 > 手游 > 2024-07-24 buildroot c语言应用获取 kernel kobject_uevent_env 发送的消息,侦测USB口变化。

2024-07-24 buildroot c语言应用获取 kernel kobject_uevent_env 发送的消息,侦测USB口变化。

2024/10/24 10:21:07 来源:https://blog.csdn.net/qq_37858386/article/details/140665412  浏览:    关键词:2024-07-24 buildroot c语言应用获取 kernel kobject_uevent_env 发送的消息,侦测USB口变化。

一、kobject_uevent_env 是 Linux 内核中的一个函数,用于发送内核事件到用户空间。它主要用于生成和发送与内核对象(kobject)相关的事件通知,这些事件通常用于通知用户空间程序(如 udev)有关硬件的变化或其他系统状态变化。

二、用户空间程序可以通过使用 netlink 套接字来接收 kobject_uevent_env 发送的消息。

三、测试C语言代码

        3.1 kernel 使用kobject_uevent_env 发送信息。

        3.2 c语言app代码


#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <sys/socket.h>
#include <linux/netlink.h>
#include <errno.h>#define UEVENT_BUFFER_SIZE 512
#define NETLINK_KOBJECT_UEVENT 15int main(void) {struct sockaddr_nl sa;int sock;char buf[UEVENT_BUFFER_SIZE];sock = socket(AF_NETLINK, SOCK_DGRAM, NETLINK_KOBJECT_UEVENT);//在较新的 Linux 内核版本中,NETLINK_KOBJECT_UEVENT 的值是 15if (sock < 0) {perror("socket");return -1;}memset(&sa, 0, sizeof(sa));sa.nl_family = AF_NETLINK;sa.nl_groups = 1;if (bind(sock, (struct sockaddr *)&sa, sizeof(sa)) < 0) {perror("bind");close(sock);return -1;}while (1) {printf("Waiting data............\n");int len = recv(sock, buf, sizeof(buf), 0);if (len < 0) {perror("recv");close(sock);return -1;}printf("Read len=%d\n",len);for (int i = 0; i < len; ) {char *event = buf + i;printf("DATA:%s \r\n",event);if (strncmp(event, "USB_STATE=DISCONNECTED",strlen("USB_STATE=DISCONNECTED")) == 0) {printf("USB device is disconnected!\n");} i += strlen(event) + 1;}}close(sock);return 0;
}

四、实例运行效果,当USB 口有变化的时候,会接收到消息。

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com