udev(九) 寫個程式檢測我們的裝置插拔

2021-05-23 11:57:08 字數 3278 閱讀 9474

在這個教程裡我將寫乙個程式,其作用是檢測系統的裝置插拔事件,當有裝置插入 系統時,就可以檢測到這個裝置並把裝置的資訊顯示出來,如果裝置從系統裡移除,也同樣可以檢測出來,並移除裝置。這個**是參考了udev-139的原始碼 的,如果讀者有興趣也可以參考udev的原始碼。其中在udev-139**中有個小小的錯誤,我將在下面的**中說出。

首先先說一下udev的乙個命令,你可以在控制台下執行:

udevadm  monitor

我的執行如下圖所示:

當插入我的金士頓優盤時,便可以檢測到優盤的插入,如下圖:

我們現在要做就是寫個程式,其輸出和上面的一樣,其實也就是udevadm的 原始碼,我只是把它的大部分**移除,只留個檢測插拔事件的**,並把很多地方的巨集和函式整合到乙個檔案中。其中具體**的api可參考libudev reference manual的說明:http://www.kernel.org/pub/linux/utils/kernel/hotplug/libudev /ch01.html

下面是源**udevadm.c:

view plain

copy to clipboard

print?

#include 

#include 

#include 

#include 

#include 

#include 

#include 

#include 

#include 

#include 

#include 

#include 

#include 

#include 

#include 

#include 

#include 

#undef asmlinkage

#ifdef __i386__

#define asmlinkage __attribute__((regparm(0)))

#else

#define asmlinkage 

#endif

#define udev_max(a,b) ((a) > (b) ? (a) : (b))

#define udev_list_entry_foreach(entry, first) /

for  (entry = first; /  

entry != null; /  

entry = udev_list_entry_get_next(entry))  

static

int  debug;  

static

int  udev_exit;  

static

void  asmlinkage sig_handler( int  signum)  

static

void  print_device( struct  udev_device *device,  const

char  *source,  int  env)  

}  

int  udevadm_monitor( struct  udev *udev)  

if  (getuid() != 0 && print_kernel)   

/* set signal handlers */

memset(&act, 0x00, sizeof ( struct  sigaction));  

act.sa_handler = (void  (*)( int )) sig_handler;  

sigemptyset(&act.sa_mask);  

act.sa_flags = sa_restart;  

sigaction(sigint, &act, null);  

sigaction(sigterm, &act, null);  

printf("monitor will print the received events for:/n" );  

if  (print_udev)   

if  (udev_monitor_enable_receiving(udev_monitor) 

printf("udev the event which udev sends out after rule processing/n" );  

}  

if  (print_kernel)   

if  (udev_monitor_enable_receiving(kernel_monitor) 

printf("uevent the kernel uevent/n" );  

}  

printf("/n" );  

while  (!udev_exit)   

if  ((kernel_monitor != null) && fd_isset(udev_monitor_get_fd(kernel_monitor), &readfds))   

if  ((udev_monitor != null) && fd_isset(udev_monitor_get_fd(udev_monitor), &readfds))   

}  

out:  

udev_monitor_unref(udev_monitor);  

udev_monitor_unref(kernel_monitor);  

return  rc;  

}  

int  main( int  argc,  char  *argv)  

下面是makefile

view plain

copy to clipboard

print?

myudevadm: udevadm.c  

gcc -g -wall -ludev udevadm.c -o myudevadm  

當插入和拔出優盤是的顯示如下圖:

記得加個sudo,要退出按ctrl-c,我的執行環境是ubuntu9.10。可看到我的優盤裝置是sde,有關分割槽是sde4,這個你可以在/dev目錄下找到,並且是usb裝置。/

寫個shell檢測多台機器磁碟

將需要檢測的機器的ip統一touch到乙個檔案裡面,此處我們命名為 linux server list.config 然後寫shell就ok了 shell如下 檔名 diskcheck.sh 用途 批量檢查磁碟空間 cd diskcheck 刪除之前已經存在的檔案 rm rf df all grep...

目標檢測 SSD(九)

可以看到ssd有以下優勢 ssd提取了不同尺度的特徵圖來做檢測,大尺度特徵圖可以用來檢測小物體,而小特徵圖用來檢測大物體 ssd採用了不同尺度和長寬比的先驗框,在faster r cnn中稱為anchors。yolo演算法缺點是難以檢測小物體,而且定位不准,但是對於這幾點,ssd在一定程度上克服這些...

用Python寫個程序監控程式

有個應用程式不是很穩定,又暫時找到具體問題,只知道出現錯誤時日誌檔案會反映出來.該應用定時更新日誌目錄,有兩個日誌檔案 fromclient.log 記錄接收請求,fromserver.log記錄接收服務端返回.出現問題時一般是fromclient.log日誌在更新,但是fromserver.log...