我想使用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时间。
答案 0 :(得分:1)
这里有多个隐含的问题:
read
是否可以保证立即或在相关事件发生后不久返回?
没有。从技术上讲,允许内核让你等待它想要的时间。
在实践中,它会立即返回(模数重新安排延迟)。
poll
和O_NONBLOCK
也是如此。 Linux不是一个实时操作系统,并且不提供硬时序保证,只是尽力而为。
是否允许
read
无限期地等待多个字节变为可用?
不,这会导致死锁。 read
需要能够以单个字节返回,即使不能保证它何时会这样做。
在实践中,Linux对1字节的工作量与对1,048,576的工作量相同。
在套接字上发送单个字节是否能够尽快唤醒远程进程?
是的,你的例子非常好。