如何阻止读取系统调用

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

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

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

Solutions Collecting From Web of "如何阻止读取系统调用"

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

在使用TTY,套接字和管道时,这更为重要。 例如,当标准输入连接到终端时,从标准输入读取将阻塞,直到用户键入一些东西。 如果我们没有收到对方的数据,那么从套接字读取将会阻塞。 从管道读取将阻塞,直到管道另一端的程序写入内容。

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

从这里 :

read()尝试读取从文件描述符fd开始在buf处开始的字节数。

在常规文件上read块时,如果常规文件是空的,则返回0(如您所见),意味着从文件读取0字节。文件类型(如FIFO /管道)支持阻止行为。