gpt4 book ai didi

c - 如何避免在命名管道关闭后阻塞 read()

转载 作者:太空狗 更新时间:2023-10-29 12:01:40 24 4
gpt4 key购买 nike

我有两个使用命名管道创建的进程。写入进程使用 write() 写入消息,读取进程使用 read() 读取消息。我注意到当作者关闭管道时 read() 会阻塞。是否可以让writer进程在关闭管道之前发送EOF,这样reader就不会被阻塞?

最佳答案

不是...不可能发送 EOF 因为 EOF 没有映射到通过 channel 发送的内容。 EOF 条件(是的,这是一个条件,不是你通过 channel 接收或发送的东西)意味着没有更多的数据要 read(2) 并且它是由一个进程获得的使 read(2) 返回读取的 0 个字符。正如您在 EOF 条件下执行的许多读取操作一样,它们将返回值 0,表示没有更多数据。

顺便说一句,当没有数据可用时,管道会阻塞读取器,但是,由于写入器仍然在那里发送更多数据,因此没有 EOF 条件。按照设计,管道在没有可用数据时阻塞读取器(但写入器仍然打开管道),并在没有更多空间将数据放入 fifo 时阻塞写入器(当有读取器打开 fifo,但没有任何数据时会发生这种情况)他们正在阅读)如您所见,这是一项功能,而不是错误。

如果你想让read(2)成为非阻塞并在没有可用数据时得到0,你可以open(2)使用 O_NONBLOCK 标志(或者稍后使用 fcntl(2) 系统调用),这将使 read(2) 立即返回使用可用数据(即使没有可用数据),但它有一个缺点:那么您无法区分没有可用数据(尚未写入)的 fifo 和实际的 EOF(作者已经关闭它的一侧)因为两者都将返回 0 作为结果。

顺便说一句,在谈论文件结束 条件时,我不喜欢使用EOF 常量,因为它增加了其定义的困惑。 EOFgetchar(3)文件结束 条件下返回的值,但它不是 char (如果你检查 getchar(3) 的定义,你会发现它被定义为 int 而不是 char,这是为了添加 EOF 条件到整个可能的 char 值范围 --- 因此,getchar(3) 返回 257 个可能的值,0 -256 用于数据,EOF 用于文件结束条件)

如果您希望编写器发出文件结束的信号,他们必须关闭(2) fifo 并重新打开它。

关于c - 如何避免在命名管道关闭后阻塞 read(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33284189/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com