Вот упрощенная версия кода, над которым я работаю:
void
stuff(int fd)
{
int ret1, ret2;
char buffer[32];
ret1 = recv(fd, buffer, 32, MSG_PEEK | MSG_DONTWAIT);
/* Error handling -- and EAGAIN handling -- would go here. Bail if
necessary. Otherwise, keep going. */
/* Can this call to recv fail, setting errno to EAGAIN? */
ret2 = recv(fd, buffer, ret1, 0);
}
Если мы предположим, что первый вызов recv завершился успешно, возвращая значение от 1 до 32, безопасно ли предположить, что второй вызов также будет успешным? Может ли ret2 быть меньше, чем ret1? В каких случаях?
(Для ясности предположим, что во время второго вызова recv нет других условий ошибки: сигнал не доставлен, он не установит ENOMEM и т. Д. Также предположим, что другие потоки не будут смотреть на fd.
Я работаю в Linux, но, как мне кажется, MSG_DONTWAIT - единственная вещь, специфичная для Linux. Предположим, что правильный fnctl был ранее установлен на других платформах.)