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 15

int 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 的值是 15
    if (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 口有变化的时候,会接收到消息。

相关推荐
辞旧 lekkk2 小时前
【Qt】信号和槽
linux·开发语言·数据库·qt·学习·mysql·萌新
袁雅倩19973 小时前
当吸尘器、筋膜枪都用上Type-C,供电方案该怎么选?浅谈PD取电芯片ECP5702的应用
c语言·开发语言·支持向量机·动态规划·推荐算法·最小二乘法·图搜索算法
疯狂成瘾者4 小时前
服务器的单体和集群
运维·服务器
liuhuizuikeai5 小时前
可视化门禁---Linux/Qt+SqLite篇
linux·运维·qt
初願致夕霞5 小时前
基于系统调用的Linux网络编程——UDP与TCP
linux·网络·c++·tcp/ip·udp
charlie1145141918 小时前
嵌入式Linux驱动开发——新 API 字符设备驱动完整教程 - 从设备结构体到应用测试
linux·运维·驱动开发
CHANG_THE_WORLD8 小时前
C语言中的 %*s 和 %.*s 和C++的字符串格式化输出
c语言·c++·c#
消失的旧时光-19438 小时前
C语言对象模型系列(四)《Linux 内核里的 container_of 到底是什么黑魔法?》—— 一篇讲透 Linux 内核的“对象模型”核心技巧
linux·c语言·算法
SWAGGY..9 小时前
Linux系统编程:(二)基础指令详解
linux·运维·服务器
kdxiaojie9 小时前
U-Boot分析【学习笔记】(3)
linux·笔记·学习