How to get the information of U disk plugging and unplugging in Linux system environment

  
The traditional way to get the U disk to insert or pull out the information is to run the hotplug program at the kernel level, the relevant parameters are passed through the environment variables, and then the hotplug notifies other hotplug applications. program. This method is somewhat inefficient. Now, a special type of socket netlink is used to obtain information about the U disk. Netlink is designed for asynchronous communication between kernel space and user space. The following example can listen to the kernel's hotplug event. The source code is as follows:
#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>#define UEVENT_BUFFER_SIZE 2048static int init_hotplug_sock(void);int main(int argc, char* argv[]){int hotplug_sock = init_hotplug_sock();while(1){char buf[UEVENT_BUFFER_SIZE*2] = {0};recv(hotplug_sock, &buf, sizeof(buf), 0); printf("%s\ ", buf);}return 0;}static int init_hotplug_sock(void){struct sockaddr_nl snl;const int Buffersize = 16 * 1024 * 1024; int retval;memset(&snl, 0x00, sizeof(struct sockaddr_nl));snl.nl_family = AF_NETLINK;snl.nl_pid = getpid();snl.nl_groups = 1;int hotplug_sock = socket (PF_NETLINK, SOCK_DGRAM, NETLINK_KOBJECT_UEVENT); if (hotplug_sock == -1) {printf("error getting socket: %s", strerror(errno));return -1;}/* set r Eceive buffersize */setsockopt(hotplug_sock, SOL_SOCKET, SO_RCVBUFFORCE, &buffersize, sizeof(buffersize));retval = bind(hotplug_sock, (struct sockaddr *) &snl, sizeof(struct sockaddr_nl));if (retval < 0 {printf("bind failed: %s", strerror(errno));close(hotplug_sock);hotplug_sock = -1;return -1;}return hotplug_sock;}
Copyright © Windows knowledge All Rights Reserved