Aquí hay una versión simplificada de un cierto código que estoy trabajando:Si un recv no bloqueante con MSG_PEEK tiene éxito, ¿tendrá éxito un recv posterior sin MSG_PEEK?
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);
}
Si suponemos que la primera llamada a recv tiene éxito, devuelve un valor entre 1 y 32, es seguro asumir que la segunda llamada también tendrá éxito? ¿Puede ret2 ser menor que ret1? En que casos?
(Para mayor claridad, suponga que no hay otras condiciones de error durante la segunda llamada a recv: que no se envía ninguna señal, que no configurará ENOMEM, etc. También suponga que no se verán otros subprocesos en fd .
estoy en Linux, pero MSG_DONTWAIT es, creo, la única cosa específica de Linux aquí. Supongamos que el fnctl derecho se haya establecido previamente en otras plataformas.)
'EBADF' no es posible a menos que otro hilo cierre' fd' entre las dos llamadas a 'recv'. – pts