gpt4 book ai didi

c++ - 如何使用 IOServiceOpenAsFileDescriptor?

转载 作者:太空宇宙 更新时间:2023-11-04 12:33:46 33 4
gpt4 key购买 nike

我连接了一个 USB 设备。我决定尝试编写一些代码,将 USB 设备作为 FileDescriptor 打开,就像在 Linux 上一样,我可以在 fd 上使用 ioctl 函数来发送命令。

我得到了以下结果:

CFMutableDictionaryRef matches = IOServiceMatching(kIOUSBDeviceClassName);
if (!matches)
{
std::cerr<<human_error_string(kIOReturnError)<<"\n";
return;
}

io_iterator_t deviceIterator;
kern_return_t kr = IOServiceGetMatchingServices(kIOMasterPortDefault, matches, &deviceIterator);
if (kr != kIOReturnSuccess)
{
std::cerr<<human_error_string(kr)<<"\n";
return;
}

io_service_t service = IO_OBJECT_NULL;
while((service = IOIteratorNext(deviceIterator)))
{
int32_t fd = IOServiceOpenAsFileDescriptor(service, O_RDWR) //doesn't work! Returns: -1

IOObjectRelease(service);
}
IOObjectRelease(deviceIterator);

但是,FD 始终为 -1.. 知道为什么吗?

最佳答案

据我所知,macOS 上没有任何类型的基于文件描述符的 USB API。您需要通过基于 IOUSB 的 API。有一些示例代码 here .

如果你想在 Linux 和 macOS 之间共享尽可能多的代码,你可以使用 libusb它包装了 Apple 的 IOKit API 和 Linux 的基于 ioctl 的 USB API。

我不得不承认我不太确定 IOServiceOpenAsFileDescriptor 的用途。 source code in IOKitLib并不是很有启发性,因为它只是连接到 XPC 服务,并且 XPC 回复中需要文件描述符。我假设该服务是在非开源或未记录的系统守护程序中实现的。

也许 IOServiceOpenAsFileDescriptor 用于访问 block 设备或串口,它们在 /dev/ 中有一个 IOKit 对象和一个设备节点文件。一般USB设备在文件系统中没有节点。

关于c++ - 如何使用 IOServiceOpenAsFileDescriptor?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57340373/

33 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com