c语言 - 带有O_ASYNC的 Linux 计时器?



O_ASYNCopen()状态的手册页:

此功能仅适用于终端、伪终端、 套接字,以及(从 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的所有其他类型的文件的源代码。

最新更新