如何在Swift中直接获取ioctl编号 无需使用Objective-C桥接头文件
我们可以直接把C侧的ioctl宏定义逻辑转换成Swift原生实现,不需要依赖桥接头文件,两种实现方案如下:
方案1:直接定义固定值(性能最优)
因为DKIOCEJECT的取值是固定不变的,我们可以直接把计算好的常量定义在Swift代码中:
// 等效C宏 #define DKIOCEJECT _IO('d', 21) let DKIOCEJECT: UInt32 = 0x20006415
方案2:保留计算逻辑(可读性更高)
如果需要保留和C宏一致的计算逻辑方便后续修改,可以用以下实现:
// 等效C的_IO宏实现 func makeIoctlIO(group: Character, number: UInt32) -> UInt32 { let IOC_VOID: UInt32 = 0x20000000 guard let groupAscii = group.asciiValue else { fatalError("ioctl的group参数必须为ASCII字符") } return IOC_VOID | (UInt32(groupAscii) << 8) | number } // 调用生成DKIOCEJECT let DKIOCEJECT = makeIoctlIO(group: "d", number: 21)
计算逻辑说明
对应你给出的C宏定义,_IO类型的ioctl编号不需要传入参数长度,因此可以省略(len & IOCPARM_MASK) << 16的计算(该部分值固定为0),最终的位运算结果和C宏生成的结果完全一致,可以直接用于ioctl请求。
内容的提问来源于stack exchange,提问作者Serena
相关产品推荐
相关产品推荐

