gpt4 book ai didi

c - 使用分散聚集处理短读/写的技术?

转载 作者:IT王子 更新时间:2023-10-29 00:25:33 24 4
gpt4 key购买 nike

分散-聚集 - readv()/writev()/preadv()/pwritev() - 在单个系统调用中读取/写入可变数量的 iovec 结构。基本上它从第 0 个 iovec 到第 N 个顺序读取/写入每个缓冲区。然而,根据文档,它在 readv/writev 调用上的返回值也可能少于请求的值。我想知道是否有标准/最佳实践/优雅的方式来处理这种情况。

如果我们只是处理一堆字符缓冲区或类似的缓冲区,这没什么大不了的。但其中一个优点是将结构和/或离散变量用作单个 iovec 项的分散聚集。你如何处理 readv/writev 只读/写结构的一部分或 long 的一半或类似的情况。

下面是我得到的一些人为设计的代码:

int fd;

struct iovec iov[3];

long aLong = 74775767;
int aInt = 949;
char aBuff[100]; //filled from where ever

ssize_t bytesWritten = 0;
ssize_t bytesToWrite = 0;

iov[0].iov_base = &aLong;
iov[0].iov_len = sizeof(aLong);
bytesToWrite += iov[0].iov_len;

iov[1].iov_base = &aInt;
iov[1].iov_len = sizeof(aInt);
bytesToWrite += iov[1].iov_len;

iov[2].iov_base = &aBuff;
iov[2].iov_len = sizeof(aBuff);
bytesToWrite += iov[2].iov_len;

bytesWritten = writev(fd, iov, 3);

if (bytesWritten == -1)
{
//handle error
}

if (bytesWritten < bytesToWrite)
//how to gracefully continue?.........

最佳答案

使用如下循环来推进部分处理的 iov:

for (;;) {
written = writev(fd, iov+cur, count-cur);
if (written < 0) goto error;
while (cur < count && written >= iov[cur].iov_len)
written -= iov[cur++].iov_len;
if (cur == count) break;
iov[cur].iov_base = (char *)iov[cur].iov_base + written;
iov[cur].iov_len -= written;
}

请注意,如果您不检查 cur < count你会读到 iov 的结尾可能包含零。

关于c - 使用分散聚集处理短读/写的技术?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5853675/

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