Linux 读取是否保证在数据可用时立即返回?
我想使用TCP套接字实现一个简单的通知协议。服务器将向套接字写入一个字节以通知客户端,客户端从套接字读取数据,等待一些数据到达,然后从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 */
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时立即返回?@basileStrynkevitchpoll()
和select()
只需告诉调用者是否read()
将立即返回。因此,如果内核延迟数据,我希望它也会延迟poll()
结果。