C 如何阻止读取系统调用

C 如何阻止读取系统调用,c,linux,io,C,Linux,Io,我不明白read()系统是如何阻塞的。我创建了一个空文件,并尝试使用read()系统调用进行读取。它返回0 fd = open("Demo.txt",O_RDONLY); n = read(fd,&ch,10); // returns 0 我希望read()会无限期地阻塞,因为文件中没有数据。Read()是否将EOF视为有效数据并立即返回?我的理解正确吗?你的理解正确read()仅当从已连接的管道或网络套接字读取时才会阻塞。是,EOF将导致read()立即返回,而不是阻塞。当您到达E

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

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

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

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

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

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

来自:

read()尝试从文件描述符fd向缓冲区读取最多个字节,从buf开始


在任何情况下,
read
都不会阻止常规文件,如果常规文件为空,则返回0(如您所见)表示从该文件读取了0个字节。。文件类型(如FIFO/管道)支持阻塞行为

如果它没有在EOF返回,你怎么知道你什么时候读完了?所有从文件中读取的程序都将永远挂起。但是,当您达到EOF时,它们也不会被阻止。不,如果在从磁盘获取数据之前没有可用数据,它也会阻止对文件的读取。但是,当到达文件末尾时,不需要等待,因为该文件不包含更多数据!文件系统知道文件的长度[在检查时-如果有人在一纳秒后写入文件,它将是不同的!]