これが私が取り組んでいるいくつかのコードの簡略化されたバージョンです:
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);
}
recvへの最初の呼び出しが成功し、1〜32の値を返すと仮定した場合、2番目の呼び出しも成功すると仮定しても安全ですか?ret2をret1より小さくすることはできますか?どちらの場合?
(わかりやすくするために、recvへの2回目の呼び出し中に他のエラー状態がないと仮定します。シグナルが配信されない、ENOMEMが設定されない、などです。また、他のスレッドがfdを参照しないと仮定します。
私はLinuxを使用していますが、ここでLinux固有のものはMSG_DONTWAITだけだと思います。正しいfnctlが他のプラットフォームで以前に設定されていると想定します。)