linux下 監控USB插入事件

2021-06-23 09:50:42 字數 4186 閱讀 4870

2009-10-09 10:08:20

|  分類:|舉報

|字型大小訂閱

**網友

目前找到3種辦法可以獲得hotplug事件。

一種是hotplug指令碼。hotplug事件發生時,核心會呼叫指令碼/sbin/hotplug。可以在這個指令碼中加入自己的操作。不過2.6核心做了很大的改變。不再支援hotplug指令碼。

還有就是netlink。這是乙個特殊的socket,可以接受來自核心的訊息。

下面是乙個netlink例程。

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

static int init_hotplug_sock(void)

/* set receive 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)

return hotplug_sock;

}#define uevent_buffer_size      2048

int main(int argc, char* argv)

;recv(hotplug_sock, &buf, sizeof(buf), 0);  

printf("%s\n", buf);

}return 0;

}2.6核心使用了乙個使用者態的程式udev來掛載/dev。這使得接受和處理來自核心的資訊變得極為方便。

udev採用規則匹配的方式,來處理裝置的掛載,同時觸發其他處理。比如下列規則就可以捕捉來自u盤插入的事件。並呼叫對應的指令碼。

bus=="usb", kernel=="sd*", run+="/root/p.sh"

/root/p.sh 的內容 

#!/bin/bash

set >> /root/usb.txt

echo -e "end****" >> /root/usb.txt

這樣就可以把發生的事件的引數列印到文字檔案中。以下是我的u盤插拔時的資訊。

action=add

bash=/bin/bash

bash_argc=()

bash_argv=()

bash_lineno=([0]="0")

bash_source=([0]="/root/p.sh")

bash_versinfo=([0]="3" [1]="1" [2]="17" [3]="1" [4]="release" [5]="i686-redhat-linux-gnu")

bash_version='3.1.17(1)-release'

devlinks='/dev/disk/by-id/usb-usb_2.0_6025 /dev/disk/by-path/pci-0000:00:1d.2-usb-0:1:1.0-scsi-0:0:0:0'

devname=/dev/sda

devpath=/block/sda

dirstack=()

euid=0

groups=()

hostname=linux230

hosttype=i686

id_bus=usb

id_model=6025

id_path=pci-0000:00:1d.2-usb-0:1:1.0-scsi-0:0:0:0

id_revision=2.00

id_serial=usb_2.0_6025

id_type=disk

id_vendor=usb_2.0

ifs=$' \t\n'

machtype=i686-redhat-linux-gnu

major=8

minor=0

opterr=1

optind=1

ostype=linux-gnu

path=/usr/local/bin:/bin:/usr/bin

physdevbus=scsi

physdevdriver=sd

physdevpath=/devices/pci0000:00/0000:00:1d.2/usb3/3-1/3-1:1.0/host5/target5:0:0/5:0:0:0

ppid=3549

ps4='+ '

pwd=/

seqnum=814

shell=/bin/bash

shellopts=braceexpand:hashall:interactive-comments

shlvl=1

subsystem=block

term=dumb

udevd_event=1

udev_log=3

uid=0

_=/bin/bash

end****

action=add

bash=/bin/bash

bash_argc=()

bash_argv=()

bash_lineno=([0]="0")

bash_source=([0]="/root/p.sh")

bash_versinfo=([0]="3" [1]="1" [2]="17" [3]="1" [4]="release" [5]="i686-redhat-linux-gnu")

bash_version='3.1.17(1)-release'

devlinks='/dev/disk/by-id/usb-usb_2.0_6025-part1 /dev/disk/by-path/pci-0000:00:1d.2-usb-0:1:1.0-scsi-0:0:0:0-part1'

devname=/dev/sda1

devpath=/block/sda/sda1

dirstack=()

euid=0

groups=()

hostname=linux230

hosttype=i686

id_bus=usb

id_fs_label=

id_fs_label_safe=

id_fs_type=vfat

id_fs_usage=filesystem

id_fs_uuid=

id_fs_version=fat32

id_model=6025

id_path=pci-0000:00:1d.2-usb-0:1:1.0-scsi-0:0:0:0

id_revision=2.00

id_serial=usb_2.0_6025

id_type=disk

id_vendor=usb_2.0

ifs=$' \t\n'

machtype=i686-redhat-linux-gnu

major=8

minor=1

opterr=1

optind=1

ostype=linux-gnu

path=/usr/local/bin:/bin:/usr/bin

physdevbus=scsi

physdevdriver=sd

physdevpath=/devices/pci0000:00/0000:00:1d.2/usb3/3-1/3-1:1.0/host5/target5:0:0/5:0:0:0

ppid=3576

ps4='+ '

pwd=/

seqnum=815

shell=/bin/bash

shellopts=braceexpand:hashall:interactive-comments

shlvl=1

subsystem=block

term=dumb

udevd_event=1

udev_log=3

uid=0

_=/bin/bash

end****

可以看到掛載了2個裝置 /dev/sda  /dev/sda1 其中乙個分割槽,乙個是裝置。

Linux 下監控USB裝置拔插事件

使用udev的規則來實現 自2.6 核心開始,就可以使用udev 協助管理系統中各裝置名稱。例如,磁碟裝置排序 網絡卡裝置排序等。udev能動態地在 dev目錄裡產生自定義的 標識性強的裝置檔案或裝置鏈結。udev依賴核心中的sysfs的支援。自2.6 核心開始,引入了sysfs 檔案系統。sysf...

linux下監控usb自動掛載

掛載路徑自己修改即可 u盤掛載部分 include checkudisk.h checkudisk checkudisk qobject parent qobject parent void checkudisk started runcmd checku qstring fidsk fdisk q...

ubuntu下USB口插入USB轉TTL檢視串口號

首先先要獲取許可權 sudo su然後 cd dev lsls可以列出所有的串口號 確保此時usb轉ttl已經插在電腦上了 然後拔掉usb轉ttl 在ls一下列出所有的串列埠裝置 對比可以發現,插上和沒插上是有區別的,插上usb轉ttl,串列埠裝置裡面多了乙個ttyusb0。通過cutecom軟體就...