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軟體就...