linux下查看usb插拔日志,Linux下侦测 USB Disk 插拔

#include

#include

#include

#include

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

}0b1331709591d260c1c78e86d0c51c18.png

Linux下,可以使用一些工具来侦测主机到目的主机经过的路由。以下是几种常用的方法: 1. 使用`ip route`命令: 使用`ip route`命令可以查看当前主机的路由表,其中包括到达目的主机的路由信息。可以使用以下命令查看路由表: ``` ip route show ``` 这将显示当前主机的路由表,其中包括到达目的主机的路由条目。你可以查看这些路由条目的下一跳地址(即下一跳路由器或目标网络的IP地址),以确定经过的路由。 2. 使用`traceroute`命令: `traceroute`命令可以用来侦测主机之间的路由路径。它通过发送TTL(Time To Live)为1的ICMP Echo请求(即ping请求)到目标主机,并记录每个路由器返回的TTL值,从而确定经过的路由。可以使用以下命令执行traceroute: ```php traceroute <目的主机IP地址> ``` 这将显示主机之间的路由路径,包括每个路由器返回的TTL值和IP地址。你可以根据这些信息来确定主机到目的主机的路由。 3. 使用`route`工具: 在某些Linux发行版中,可以使用`route`工具来查看路由表和执行路由操作。可以使用以下命令查看路由表: ```arduino route -n ``` 这将显示当前主机的路由表,其中包括到达目的主机的路由条目。你可以使用`route add`命令添加新的路由条目,并使用`route -p`命令将路由条目添加到系统启动时自动加载的路由表中。 以上方法可以帮助你在Linux侦测主机到目的主机经过的路由。你可以根据需要选择适合你的方法来查看路由信息。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值