Ecco una versione semplificata di un certo codice su cui sto lavorando:Se una recv non bloccante con MSG_PEEK ha esito positivo, verrà eseguita anche una successiva recv senza 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);
}
Se assumiamo che la prima chiamata a recv riesce, restituendo un valore compreso tra 1 e 32, è sicuro supporre che la seconda chiamata riuscirà anche? Ret2 può essere mai inferiore a ret1? In quali casi?
(Per maggiore chiarezza, si supponga che non ci siano altre condizioni di errore durante la seconda chiamata a recv: che nessun segnale viene consegnato, che non imposterà ENOMEM, ecc. Si supponga inoltre che nessun altro thread guarderà a fd .
sono su Linux, ma MSG_DONTWAIT è, credo, l'unica cosa specifico per Linux qui. si supponga che la fnctl destra è stato impostato in precedenza su altre piattaforme.)
'EBADF' non è possibile a meno che un altro thread non chiuda' fd' tra le due chiamate a 'recv'. – pts