我不明白read()系统是如何阻塞的。我创建了一个空文件并尝试使用read()系统调用进行读取。它返回0。
fd = open("Demo.txt",O_RDONLY);
n = read(fd,&ch,10); // returns 0
由于文件中没有数据,我期望read()无限期地阻塞。 read()会将EOF视为有效数据并立即返回吗?我的理解是否正确?
答案 0 :(得分:6)
是的,EOF会导致read()立即返回,而不是阻止。当你到达EOF时,read()不会等待更多的数据写入文件;它立即返回0个字节。除了磁盘上的数据读入内存时通常难以察觉的延迟之外,从磁盘上读取文件时,阻塞不起作用。
使用TTY,套接字和管道时更有意义。例如,当stdin连接到终端时从stdin读取将阻塞,直到用户键入内容为止。如果我们没有从另一方接收数据,则从套接字读取将阻止。从管道读取将阻塞,直到管道另一侧的程序写入内容。
答案 1 :(得分:3)
您的理解是正确的。 read()
仅在从已连接的管道或网络套接字读取时才会阻止。
答案 2 :(得分:0)
来自here:
read()尝试从buf开始读取从文件描述符fd到缓冲区的字节数。
read
阻止常规文件,如果常规文件为空,则返回0(正如您所见)预计意味着从文件中读取0个字节。文件类型(例如FIFO /管道)支持阻塞行为。