加载中…
个人资料
  • 博客等级:
  • 博客积分:
  • 博客访问:
  • 关注人气:
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
正文 字体大小:

Linux 平台下监视 USB 设备插拔

(2011-11-02 17:07:59)
标签:

杂谈

分类: *C/CPlusPlus
#include <stdio.h>
#include <string.h>
#include <sys/socket.h>
#include <linux/netlink.h>


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
    {
       
        snl.nl_family = AF_NETLINK;
        snl.nl_pad = 0;
       
        snl.nl_pid = getpid();
        snl.nl_groups = 1;

       
       
        sfd = socket( PF_NETLINK,
                      SOCK_DGRAM,
                      NETLINK_KOBJECT_UEVENT );
       
        if ( -1 == sfd )
        {
            iResult = -1;
            break;
        }

       
        setsockopt( sfd,
                    SOL_SOCKET,
                    SO_RCVBUF,  
                    &uiRecvBuffSize,
                    sizeof( uiRecvBuffSize ) );

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

           
            if( 0 == memcmp( caKernelMsgBuff,
                             "add@",
                             4 )
                &&
                NULL != strstr( caKernelMsgBuff,
                                "usb" ) )
            {
                printf( "Add USB Device\n" );
                break;
            }

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

0

阅读 收藏 喜欢 打印举报/Report
  

新浪BLOG意见反馈留言板 欢迎批评指正

新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 产品答疑

新浪公司 版权所有