2014-03-05 48 views
3

我真的不明白“关闭管道的写入结束”和“不写入任何东西到管道”之间的区别。如果我没有写入任何东西到管道中,并且管道是空的,为什么读取端只是被阻塞而不是读取EOF?与关闭写入结束有什么不同?只有当写入结束时,管道的读取结束才会读取EOF?

+3

好吧,想想它就像一个电话。只是因为目前没有人说什么并不意味着他们不会很快开始。 EOF就像他们挂起。 – RedX

回答

7

从管道(或任何东西)读取EOF表示没有更多输入,并且将来不会有任何输入。

如果此时没有可用输入,但管道尚未关闭,则读卡器将(默认情况下)阻止等待输入;如果作者随后写入管道,那么这些数据将会提供给读者。 EOF会告诉读者停止尝试读取更多数据。

+1

因此,EOF不像从管道中读取的文字内容?这就像是当所有写入结束都关闭时内核发送到读取结束的信号? – Xufeng

+0

@旭峰:对。 EOF是C库的一个组合值。它在操作系统中不存在。 –

+1

@旭峰:对。将其称为文件结束条件会更准确。它如何显示取决于你如何从管道中读取数据。如果使用'fgetc()',它将返回'EOF',这是一个与任何'unsigned char'值不同的负的'int'值。其他一些函数返回读取的项目数量;例如,'read()'函数返回'0'来表示文件结束。 (或错误条件)。 –

0

这就是阻止文件描述符的协议。管道的读取端等待的数据。关闭它的写入结束信号表示流结束。这实际上是一个强大的同步概念。

您可以将管道切换到非阻塞模式,其中缺少数据被视为软错误,因此您可以检查是否有任何要读取的内容。当有多个文件描述符可以读取时(如处理多个客户端的服务器),这非常有用。这就是IO复用进来。