est ici une version simplifiée d'un certain code que je travaille sur:Si une recv non bloquante avec MSG_PEEK réussit, un recv ultérieur sans MSG_PEEK réussira-t-il également?
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 nous supposons que le premier appel à recv réussit, retourner une valeur comprise entre 1 et 32, est-il raisonnable de supposer que le deuxième appel va également réussir? Est-ce que ret2 peut être moins que ret1? Dans quels cas? Pour des raisons de clarté, supposons qu'il n'y ait pas d'autres conditions d'erreur lors du second appel à recv: qu'aucun signal n'est délivré, qu'il ne définira pas ENOMEM, etc. Supposons également qu'aucun autre thread ne regarde fd .
Je suis sous Linux, mais MSG_DONTWAIT est, je crois, la seule chose spécifique à Linux ici. on suppose que le droit fnctl a été définie auparavant sur d'autres plateformes.)
'EBADF' n'est pas possible à moins qu'un autre thread ferme' fd' entre les deux appels à 'recv'. – pts