Hier ist eine vereinfachte Version von Code auf ich arbeite:Wenn ein nonblocking recv mit MSG_PEEK erfolgreich ist, wird ein nachfolgendes recv ohne MSG_PEEK auch erfolgreich sein?
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);
}
Wenn wir, dass der erste Aufruf recv annehmen gelingt es, einen Wert zwischen 1 und 32 zurückkehrt, ist es sicher, dass der zweite Anruf anzunehmen, wird auch gelingen? Kann ret2 jemals kleiner als ret1 sein? In welchen Fällen?
(Angenommen, es gibt keine anderen Fehlerbedingungen während des zweiten Recv-Aufrufs: kein Signal wird gesendet, es wird nicht ENOMEM usw. gesetzt. Außerdem wird angenommen, dass keine anderen Threads fd betrachten die einzige Linux-spezifische Sache hier.
ich auf Linux bin, aber MSG_DONTWAIT ist, glaube ich. Es sei angenommen, dass das Recht fnctl auf anderen Plattformen vorher gesetzt wurde.)
'EBADF' ist nicht möglich, wenn nicht ein anderer Thread' fd' zwischen den beiden Aufrufen von 'recv' schließt. – pts