4

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

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

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

4

3 回答 3

6

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

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

于 2013-02-05T18:00:30.063 回答
3

你的理解是正确的。 read()仅在从已连接的管道或网络套接字读取时才会阻塞。

于 2013-02-05T18:00:11.677 回答
0

这里

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

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

于 2013-02-05T18:01:12.667 回答