歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux基礎 >> Linux教程 >> Linux下偵測 USB Disk 插拔

Linux下偵測 USB Disk 插拔

日期:2017/2/28 15:57:38   编辑:Linux教程

#include <stdio.h>
#include <string.h>
#include <sys/socket.h>
#include <linux/netlink.h>


// netlink.h 中定義
//struct sockaddr_nl
//{
// sa_family_t nl_family; // AF_NETLINK
// unsigned short nl_pad; // zero
// __u32 nl_pid; // 進程ID
// __u32 nl_groups; // 多播組掩碼
//};
//


static int
monitoring_usb_device( void )
{
// 本函數返回值
int iResult = 0;
// 接收內核發來的消息字符串
char caKernelMsgBuff[1024];
// 接收內核發來的消息緩沖區大小
const unsigned int uiRecvBuffSize = sizeof( caKernelMsgBuff );
// 套接字地址
struct sockaddr_nl snl;
// 套接字文件描述符
int sfd = -1;


do // 非循環,只是為了減少分支嵌套
{
// 1.添寫套接字地址
snl.nl_family = AF_NETLINK;
snl.nl_pad = 0;
// 如果希望內核處理消息或多播消息,就把該字段設置為 0,
// 否則設置為處理消息的進程ID。
snl.nl_pid = getpid();
snl.nl_groups = 1;


// 2.創建套接字
// NETLINK_KOBJECT_UEVENT - 內核消息到用戶空間,出現在 Linux 2.6.10
sfd = socket( PF_NETLINK, // 使用 netlink
SOCK_DGRAM, // 使用不連續不可信賴的數據包連接
NETLINK_KOBJECT_UEVENT );
// 如果 創建套接字失敗 的話,則
if ( -1 == sfd )
{
iResult = -1;
break;
}


// 3.設置套接字接收緩沖區大小
setsockopt( sfd,
SOL_SOCKET, // 存取 socket 層
SO_RCVBUF, // 設置接收緩沖區大小
&uiRecvBuffSize,
sizeof( uiRecvBuffSize ) );


// 4.將套接字加入指定的多播組
iResult = bind( sfd,
(struct sockaddr*)&snl,
sizeof( snl ) );
// 如果 將套接字加入指定的多播組失敗 的話,則
if ( -1 == iResult )
{
return -2;
break;
}


while( 1 )
{
// 接收內核消息
recv( sfd,
&caKernelMsgBuff,
sizeof( caKernelMsgBuff ),
0 );


printf( "Kernel Message:\n%s\n", caKernelMsgBuff );


// USB 設備的插入時,會出現以 add@/devices/ 開頭,含 usb 的字符串
if( 0 == memcmp( caKernelMsgBuff,
"add@",
4 )
&&
NULL != strstr( caKernelMsgBuff,
"usb" ) )
{
printf( "Add USB Device\n" );
break;
}


// USB 設備的拔除時,會出現以 remove@/devices/ 開頭,含 usb 的字符串
if( 0 == memcmp( caKernelMsgBuff,
"remove@",
7 )
&&
NULL != strstr( caKernelMsgBuff,
"usb" ) )
{
printf( "Remove USB Device\n" );
break;
}
}


// 等一秒鐘,讓設備加載完畢
sleep(1);


}while( 0 );


// 如果 創建套接字成功 的話,則
if ( -1 != sfd )
{
// 關閉套接字
close( sfd );
sfd = -1;
}


return iResult;
}


int main(int argc, char* argv[])
{
printf( "monitoring_usb_device return %d\n",
monitoring_usb_device() );


return 0;

}

Copyright © Linux教程網 All Rights Reserved