Linux 读取是否保证在数据可用时立即返回?

Linux 读取是否保证在数据可用时立即返回?,linux,sockets,tcp,Linux,Sockets,Tcp,我想使用TCP套接字实现一个简单的通知协议。服务器将向套接字写入一个字节以通知客户端,客户端从套接字读取数据,等待一些数据到达,然后从read调用返回并执行一些工作 while (1) { /* Wait for any notifications */ char buf[32]; if (read(fd, buf, sizeof(buf)) <= 0) { break; } /* Received notification */

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

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

    /* Received notification */
    do_work();
}
while(1){
/*等待任何通知*/
char-buf[32];

如果(读(fd,buf,sizeof(buf))这里有多个隐含问题:

read
是否保证在相关事件发生后立即返回

不。从技术上讲,内核可以让你想等多久就等多久

在实践中,它将立即返回(模重调度延迟)

这对于poll和onblock也是如此。Linux不是一个实时操作系统,它不提供硬定时保证,只是尽了最大努力

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

不,这将导致死锁。
read
需要能够返回一个字节,即使无法保证何时返回

实际上,Linux对1字节的处理与对1048576的处理相同

在套接字上发送一个字节是否是尽快唤醒远程进程的实用方法


是的,您的示例非常好。

阅读我不认为它是指定的,但我从未听说过TCP实现会等待。但是您如何区分内核等待和网络中延迟的数据包之间的区别呢?@Barmar是的,我只是想知道内核是否会增加任何额外的延迟。我不知道认为它与任何其他流有任何不同。从终端读取的数据是否保证在用户按return时立即返回?@basileStrynkevitch
poll()
select()
只需告诉调用者是否
read()
将立即返回。因此,如果内核延迟数据,我希望它也会延迟
poll()
结果。