如何阻止读取系统调用

时间:2013-02-05 17:54:24

标签: c linux io

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

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

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

3 个答案:

答案 0 :(得分:6)

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

使用TTY,套接字和管道时更有意义。例如,当stdin连接到终端时从stdin读取将阻塞,直到用户键入内容为止。如果我们没有从另一方接收数据,则从套接字读取将阻止。从管道读取将阻塞,直到管道另一侧的程序写入内容。

答案 1 :(得分:3)

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

答案 2 :(得分:0)

来自here

  

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

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