这里提供一个Linux下U盘自动识别和挂载的程序,不是Shell脚本喔。

#define UEVENT_BUFFER_SIZE 2048
#define NETLINK_KOBJECT_UEVENT 15

int init_hotplug_sock(void)
{
const int buffersize = 1024;
int ret;
int s;

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

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;
}

void split_udev(char *str)
{
char action[50] = { 0 };
char block[50] = { 0 };
char tmp[50] = { 0 };
char dname[50] = { 0 };
char fname[50] = { 0 };
sscanf(str, "%[a-z]@/%[a-z]/%[^/]/%[^/]", action, block, tmp,
fname);
if (!strcmp(action, "add")) {
if (!strcmp(block, "block")) {
if (strlen(fname) > 3) {
char cmd[200];
sprintf(dname, "/dev/%s", fname);
sprintf(cmd, "mount -t vfat %s /mnt/usb",
dname);
printf("cmd = %s\n", cmd);
sleep(2);
system(cmd);
}
}
g_usb_state = ADD_DEV;
} else if (!strcmp(action, "remove")) {
if (!strcmp
(str, "remove@/devices/platform/at91_ohci/usb1/1-1")) {
sleep(2);
printf(" \n");
system("umount /mnt/usb");
printf("cmd = umount /mnt/usb\n");
g_usb_state = REMOVE_DEV;
}
} else if (!strcmp(action, "mount")) {
g_usb_state = MOUNT_DEV;
} else if (!strcmp(action, "umount")) {
g_usb_state = NO_DEV;
}
}

// 监视USB状态线程
void *usb_check(void *p)
{
int hotplug_sock = init_hotplug_sock();
char buf[UEVENT_BUFFER_SIZE * 2] = { 0 };
g_usb_state = NO_DEV;
while (1) {
memset(buf, 0, UEVENT_BUFFER_SIZE * 2);
recv(hotplug_sock, &buf, sizeof(buf), 0);
printf("%s\n", buf);
split_udev(buf);
}
pthread_detach(pthread_self());
}