一旦数据可用,读保证会立即返回吗?

时间:2017-10-02 18:00:10

标签: linux sockets tcp

我想使用TCP套接字实现一个简单的通知协议。服务器将一个字节写入套接字以通知客户端,客户端从套接字读取,等待一些数据到达,此时它可以从read调用返回并执行一些工作。

while (1) {
    /* Wait for any notifications */
    char buf[32];
    if (read(fd, buf, sizeof(buf)) <= 0) {
        break;
    }

    /* Received notification */
    do_work();
}

我的问题是,只要任何数据可供读取,read保证会返回,或者内核是否允许等待直到满足某些条件(例如某些最小值)在从count调用返回之前收到的字节数,不一定是read我传入read的字节数?如果后者为真,是否有一个标志会禁用该行为?

我知道我可以使用O_NONBLOCK标志并在循环中调用read,但这样做的目的是尽可能少地使用CPU时间。

1 个答案:

答案 0 :(得分:1)

这里有多个隐含的问题:

  

read是否可以保证立即或在相关事件发生后不久返回?

没有。从技术上讲,允许内核让你等待它想要的时间。

在实践中,它会立即返回(模数重新安排延迟)。

pollO_NONBLOCK也是如此。 Linux不是一个实时操作系统,并且不提供硬时序保证,只是尽力而为。

  

是否允许read无限期地等待多个字节变为可用?

不,这会导致死锁。 read需要能够以单个字节返回,即使不能保证它何时会这样做。

在实践中,Linux对1字节的工作量与对1,048,576的工作量相同。

  

在套接字上发送单个字节是否能够尽快唤醒远程进程?

是的,你的例子非常好。