这是我正在处理的一些代码的简化版本:
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 之间的值,那么假设第二次调用也会成功是否安全?ret2 可以小于 ret1 吗?在哪些情况下?
(为了清楚起见,假设在第二次调用 recv 期间没有其他错误条件:没有传递信号,它不会设置 ENOMEM 等。还假设没有其他线程会查看 fd。
我在 Linux 上,但我相信 MSG_DONTWAIT 是这里唯一特定于 Linux 的东西。假设之前在其他平台上设置了正确的 fnctl。)