は、ここで私が働いているいくつかのコードの簡易版です:私たちはRECVへの最初の呼び出しが成功したと仮定した場合MSG_PEEKの非ブロックrecvが成功した場合、MSG_PEEKのない次のrecvも成功しますか?
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);
}
、1と32の間の値を返す、それは安全で2回目の呼び出しと仮定することです成功するでしょうか? ret2はret1未満になることはありますか?どの場合?
recvへの2回目の呼び出しでは、信号が出力されないこと、ENOMEMが設定されないなどのエラー条件がないことを前提としています。また、他のスレッドがfd 。
私は、Linux上だけど、MSG_DONTWAITは、私は信じて、ここでの唯一のLinux固有のものである。右fnctlは、他のプラットフォームで以前に設定されたと仮定します。)
他のスレッドが 'recv'の2回の呼び出しの間に' fd'を終了しない限り、 'EBADF'は可能ではありません。 – pts