C/C++知识点之监听设备移除
小标 2019-03-14 来源 : 阅读 1423 评论 0

摘要:本文主要向大家介绍了C/C++知识点之监听设备移除,通过具体的内容向大家展示,希望对大家学习C/C++知识点有所帮助。

本文主要向大家介绍了C/C++知识点之监听设备移除,通过具体的内容向大家展示,希望对大家学习C/C++知识点有所帮助。

C/C++知识点之监听设备移除

////  main.c//  DriverIterator//#include <CoreFoundation/CoreFoundation.h>#include <IOKit/IOKitLib.h>#include <IOKit/IOMessage.h>void DeviceNotification (void* refCon, io_service_t service, natural_t messageType, void* messageArgument);//描述驱动程序实例的结构体typedef struct {    io_service_t    service;    io_object_t     notification;
} MyDriverData;//通知端口,用于设备接入和驱动程序状态改变IONotificationPortRef   gNotificationPort = NULL;//回调void DeviceAdded (void* refCon, io_iterator_t iterator){    io_service_t        service = 0;    // 迭代所有匹配对象    while ((service = IOIteratorNext(iterator)) != 0)
    {
        MyDriverData*   myDriverData;        kern_return_t   kr;        //分配一个结构体,保存驱动程序实例
        myDriverData = (MyDriverData*)malloc(sizeof(MyDriverData));        //为该驱动程序实例保存 io_service_t
        myDriverData->service = service;        // 安装回调,接收驱动程序状态改变通知
        kr = IOServiceAddInterestNotification(gNotificationPort,                                    //驱动程序对象
                                    service,
                                    kIOGeneralInterest,
                                    DeviceNotification,     // 回调
                                    myDriverData,           // 传递给回调的refCon
                                    &myDriverData->notification);
    }
}void DeviceNotification (void* refCon, io_service_t service, natural_t messageType, void* messageArgument){
    MyDriverData*   myDriverData = (MyDriverData*)refCon;    kern_return_t   kr;    //只处理驱动程序终止通知    if (messageType == kIOMessageServiceIsTerminated)
    {        //输出移除设备的名称        io_name_t   name;
        IORegistryEntryGetName(service, name);        printf(""Device removed: %s\n"", name);        //移除驱动程序状态改变通知
        kr = IOObjectRelease(myDriverData->notification);        //释放驱动程序对象的引用
        IOObjectRelease(myDriverData->service);        //释放保存驱动程序连接的结构体        free(myDriverData);
    }
}int main (int argc, const char * argv[]){
    CFDictionaryRef         matchingDict = NULL;    io_iterator_t           iter = 0;
    CFRunLoopSourceRef      runLoopSource;    kern_return_t           kr;    //创建一个匹配字典,用于查找任意的 USB 设备
    matchingDict = IOServiceMatching(""IOUSBDevice"");    //创建一个端口
    gNotificationPort = IONotificationPortCreate(kIOMasterPortDefault);
    runLoopSource = IONotificationPortGetRunLoopSource(gNotificationPort);
    CFRunLoopAddSource(CFRunLoopGetCurrent(), runLoopSource, kCFRunLoopDefaultMode);    //注册回调
    kr = IOServiceAddMatchingNotification(gNotificationPort, kIOFirstMatchNotification, matchingDict, DeviceAdded, NULL, &iter);
    DeviceAdded(NULL, iter);

    CFRunLoopRun();

    IONotificationPortDestroy(gNotificationPort);
    IOObjectRelease(iter);    return 0;
}
liuhailong:~ liuhailong$ /Users/liuhailong/Library/Developer/Xcode/DerivedData/DriverIterator-czxxwkiooesdvlcbdaplulnfglcj/Build/Products/Debug/DriverIterator Device removed: IOUSBHostDevice

本文由职坐标整理并发布,希望对同学们有所帮助。了解更多详情请关注职坐标编程语言C/C+频道!

本文由 @小标 发布于职坐标。未经许可,禁止转载。
喜欢 | 0 不喜欢 | 0
看完这篇文章有何感觉?已经有0人表态,0%的人喜欢 快给朋友分享吧~
评论(0)
后参与评论

您输入的评论内容中包含违禁敏感词

我知道了

助您圆梦职场 匹配合适岗位
验证码手机号,获得海同独家IT培训资料
选择就业方向:
人工智能物联网
大数据开发/分析
人工智能Python
Java全栈开发
WEB前端+H5

请输入正确的手机号码

请输入正确的验证码

获取验证码

您今天的短信下发次数太多了,明天再试试吧!

提交

我们会在第一时间安排职业规划师联系您!

您也可以联系我们的职业规划师咨询:

小职老师的微信号:z_zhizuobiao
小职老师的微信号:z_zhizuobiao

版权所有 职坐标-一站式IT培训就业服务领导者 沪ICP备13042190号-4
上海海同信息科技有限公司 Copyright ©2015 www.zhizuobiao.com,All Rights Reserved.
 沪公网安备 31011502005948号    

©2015 www.zhizuobiao.com All Rights Reserved

208小时内训课程