【问题标题】:How to block the read system call如何阻止读取系统调用
【发布时间】:2013-02-05 17:54:23
【问题描述】:

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

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

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

【问题讨论】:

  • 如果它没有在 EOF 返回,你怎么知道你什么时候读完了?所有从文件中读取的程序都将永远挂起。

标签: c linux io


【解决方案1】:

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

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

【讨论】:

  • 但是当你到达 EOF 时它们也不会阻塞。
【解决方案2】:

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

【讨论】:

  • 不,如果在从磁盘获取数据之前没有可用数据,它也会阻止对文件的读取。但是,当到达文件末尾时,无需等待,因为文件不再包含数据!文件系统知道文件的长度[在检查时 - 如果有人在一纳秒后写入文件,那将是不同的!]
【解决方案3】:

来自here

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-03-09
    • 2020-09-14
    • 2011-06-09
    • 1970-01-01
    • 2013-09-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多