使用scatter-gather处理短读/写的技术?

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

如果我们只是处理一堆字符缓冲区或类似的东西,这不是什么大问题.但其中一个细节是使用分散 – 聚集结构和/或离散变量作为单独的iovec项目.你如何处理readv / writev只读取/写入一个结构的一部分或一半长或类似的情况.

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

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<算你读过iov的结尾可能包含零.

相关文章

本程序的编译和运行环境如下(如果有运行方面的问题欢迎在评...
水了一学期的院选修,万万没想到期末考试还有比较硬核的编程...
补充一下,先前文章末尾给出的下载链接的完整代码含有部分C&...
思路如标题所说采用模N取余法,难点是这个除法过程如何实现。...
本篇博客有更新!!!更新后效果图如下: 文章末尾的完整代码...
刚开始学习模块化程序设计时,估计大家都被形参和实参搞迷糊...