O_ASYNC
的open()
状态的手册页:
此功能仅适用于终端、伪终端、 套接字,以及(从 Linux 2.6 开始)管道和 FIFO。 参见 fcntl(2) 更多细节。
但是我已经成功地使用了 linux 计时器epoll()
并且在计时器 fd 上设置带有fcntl()
O_ASYNC
不会返回错误。显然,也没有发出任何信号。我的问题是,是否可以O_ASYNC
使用 linux 计时器?网上有没有例子?我知道POSIX替代方案,但希望避免它。
我们可以看到F_SETFL
调用setfl
,它调用特定于文件类型的fasync
函数。
通过搜索fasync,我们可以看到如何在许多设备中实现异步支持。似乎它并不太复杂,因为大多数情况下它只需要设备来存储异步注册并发送信号(这是此类文件的fasync
函数实现)。
回到setfl
我们可以注意到,如果文件类型的fasync
函数为 null,它只是静默成功。这可能是一个错误,也可能是故意的。让我们假设这是一个错误。
现在错误在内核中,可能有程序依赖于它,如果错误被修复,这些程序将停止工作。如果一个程序确实坏了,有人抱怨它,修复就会被撤消,这样程序就会继续工作,因为Linus不喜欢破坏程序。如果它没有破坏任何实际存在的程序(在我看来,这不太可能),它可以被修复。
另一种选择是更新文档。
另一种选择是使其实际工作。
我的问题是,是否可以O_ASYNC使用 linux 计时器?
任何程序都不太可能(但仍有可能)在 timerfd 上设置O_ASYNC,因为它不起作用 - 因此它不太可能破坏兼容性。根据其他示例,它看起来实现起来并不复杂。因此,请继续编写此补丁并将其发送到邮件列表。
如果你的意思是,如果可以在今天的内核上实现,没有补丁,答案是否定的,不是。这是 timerfd 操作结构,没有fasync
网上有没有例子?
是的,这些示例是支持fasync
的所有其他类型的文件的源代码。