여기 내가 일하고 있어요 일부 코드의 단순화 된 버전입니다 : 우리가 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 사이의 값을 반환 안전하게 두 번째 호출한다고 가정하는 것입니다 또한 성공할 것인가? ret2는 ret1보다 적을 수 있습니까? 어떤 경우에?
recv에 대한 두 번째 호출 중에 다른 오류 조건이 없다고 가정합니다. 신호가 전달되지 않고 ENOMEM이 설정되지 않습니다. 또한 다른 스레드가 fd .
내가 리눅스에있어,하지만 MSG_DONTWAIT 여기, 내가 생각하는 유일한 리눅스 고유의 것입니다. 우측 fnctl가 다른 플랫폼에서 이전에 설정 한 것으로 가정합니다.)
다른 스레드가'recv'에 대한 두 번의 호출 사이에서'fd'를 닫지 않으면'EBADF'가 가능하지 않습니다. – pts