Scatter-collect - 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?.........