- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我正在研究 writev
和 readv
,当我显示内存内容时,我得到了奇怪的数据:
struct iovec *iov = malloc(sizeof(struct iovec) * 3);
iov[0].iov_base = test_string1;
iov[0].iov_len = strlen(test_string1);
printf("test1: IOV: &%#x, IOV: %#x, IOV_BASE: &%#x, IOV_BASE: %#x IOV_LEN: &%#x IOV_LEN: %#x\n",
&iov[0], iov[0], &iov[0].iov_base, iov[0].iov_base, &iov[0].iov_len, iov[0].iov_len);
我期待:
IOV&
放置IOV
IOV
将存储的值。IOV_BASE&
应该放IOV_BASE
的位置IOV_BASE
应该放在test_string1
IOV_LEN&
应该放IOV_LEN
的位置IOV_LEN
应该放test_string1
但是,当运行它时,我得到了这些结果:
test1: IOV: &0x603010, IOV: 0x400d34, IOV_BASE: &0xe, IOV_BASE: 0x603010 IOV_LEN: &0x400d34 IOV_LEN: 0x603018
现在,当在 gdb 中打印 iov[0]
时,我得到这些值:
(gdb) print iov[0]
$1 = {
iov_base = 0x400d34,
iov_len = 14
}
真正奇怪的是iov_len
。根据 gdb,test_string1
的长度为 14 个字符(实际上是这样);然而,程序说它的长度是 6303768(十进制)。该程序确实输出了正确的长度值,但它不在正确的位置 (IOV_BASE
)。
关于为什么会发生这种事情有什么想法吗?
最佳答案
这与 readv()
和 writev()
函数几乎没有关系,它只与 struct iovec
相关> 他们都使用的类型。
您必须始终确保传递给 printf()
的格式字符串中的转换规范正确匹配同一调用中传递的其余参数的类型。你没有这样做。 %x
字段描述符要求相应的参数是适当宽度的无符号整数类型(#
标志不会改变这一点)。您的实际参数是 struct iovec *
、struct iovec
、void **
、void *
、一个 size_t *
和一个 size_t
。 没有一个对于给定的字段类型是正确的,除了如果 size_t
与 int
的宽度相同(通常不是)。
根据标准,“如果任何参数不是相应转换规范的正确类型,则行为未定义”(C2011、7.21.6.1/9、7.21.6.3/2)。这适用于您的通话。过度思考或试图解释未定义的行为并不是很有用,因为它是未定义的。
我不确定我是否遵循了您预期的行为,尤其是关于 iov[0]
。那是一个结构
。 struct
没有转换说明符,并且您碰巧获得的任何转换——如果程序没有简单地崩溃——很可能是您的特定 C 实现的特殊性,也许是您的程序的特殊性,甚至可能是月相(参见“未定义的行为”)。
您可以尝试打印有关您的struct iovec
的详细信息:
printf("test1: IOV &: %p, IOV_BASE &: %p, IOV_BASE: %p, IOV_LEN &: %p, IOV_LEN: %#zx\n",
(void *) &iov[0], (void *) &iov[0].iov_base, iov[0].iov_base,
(void *) &iov[0].iov_len, iov[0].iov_len);
%p
转换说明符用于打印指针(指向void
)。最后一个转换说明符中的 z
宽度说明符表示参数是 size_t
的宽度(事实上,该参数恰好是 size_t
)。您不能打印 struct
本身,所以我省略了它。我插入了转换以将指针参数转换为 void *
类型。所有指针都可以转换为这种类型而不会丢失信息,具体是 void *
必须对应一个 %p
说明符。
关于c - iov(writev)中的奇怪包装?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36988645/
我正在研究 writev 和 readv,当我显示内存内容时,我得到了奇怪的数据: struct iovec *iov = malloc(sizeof(struct iovec) * 3); iov[
我正在编写 C++ 程序(见下文)。我的目标是将数据存储在 iov 结构中。我在构造函数中分配了固定长度的缓冲区。每次缓冲区被填满时,我都想在 iov 中传输数据并分配新的固定长度的缓冲区。最后,当完
Samsung PM1733/1735 NVMe SSD 声明支持 SR-IOV。并且希望用PM1735 SSD搭建一个NVMe SR-IOV环境。我的 SSD 的开发说明是/dev/nvme1。 但
Amazon/AWS EC2 提供 SR-IOV(单根 I/O 虚拟化)实例,它称之为“enhanced networking”——Google 是否在 Compute Engine 上提供此功能?
我无法弄清楚 virtio、仿真 IO、直接 I/O、I/O 直通、SR-IOV 之间的区别,谁能帮忙 最佳答案 virtio 是一个存在于 KVM Hypervisor 中的虚拟化驱动程序。 例如,
我是一名优秀的程序员,十分优秀!