Вот упрощенная версия некоторого кода, над которым я работаю:
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 был установлен ранее на других платформах.)