如何阻止read系统调用

问题描述 投票:0回答:3

我不明白 read() 系统是如何阻塞的。我创建了一个空文件并尝试使用 read() 系统调用进行读取。它返回 0。

fd = open("Demo.txt",O_RDONLY);
n = read(fd,&ch,10); // returns 0 

我期望 read() 无限期地阻塞,因为文件中没有数据。 read()是否认为EOF是有效数据并立即返回?我的理解正确吗?

c linux io
3个回答
7
投票

是的,EOF会导致read()立即返回,而不是阻塞。当到达 EOF 时,read() 不会等待更多数据写入文件;它立即返回 0 字节。从磁盘文件读取时,除了将磁盘上的数据读入内存时通常难以察觉的延迟之外,阻塞不会发挥作用。

在使用 TTY、套接字和管道时更相关。例如,当 stdin 连接到终端时,从 stdin 读取数据将会阻塞,直到用户键入某些内容。如果我们没有从另一端接收到数据,从套接字读取将会阻塞。从管道读取数据将会阻塞,直到管道另一端的程序写入内容。


3
投票

您的理解是正确的。

read()
仅当从已连接的管道或网络套接字读取数据时才会阻塞。


0
投票

这里

read() 尝试从文件描述符 fd 中读取 count 个字节到从 buf 开始的缓冲区中。

read
在任何时候都不会阻塞常规文件,如果常规文件为空,则预期返回 0(如您所见),这意味着从文件中读取了 0 个字节。文件类型(例如 FIFO/管道)支持阻塞行为。

© www.soinside.com 2019 - 2024. All rights reserved.