【问题标题】:Problem with .release behavior in file_operationsfile_operations 中的 .release 行为问题
【发布时间】:2010-05-22 21:12:14
【问题描述】:

我正在处理内核模块中的一个问题,该模块使用 /proc 条目从用户空间获取数据。

我为我自己定义的 /proc 条目设置了打开/写入/发布条目,并妥善管理以使用它从用户空间获取数据。 我很好地处理了 open/write 函数中的错误,并且它们对用户可见为 open/fopen 或 write/fwrite/fprintf 错误。

但有些错误只能在关闭时检查(因为此时所有数据都可用)。在这些情况下,我返回不同于 0 的值,我应该以某种方式将值“close”或“fclose”返回给用户。

但无论我返回什么值,我的 close 行为都会像一切正常的情况一样。 为了确保我用一个简单的'return(-1);'替换了所有的 release() 代码并编写了一个程序来打开/写入/关闭 /proc 条目,并打印关闭返回值(和 errno)。无论我给出什么值,它总是返回“0”。

行为与 'fclose' 相同,或者使用 shell 机制(echo "..." >/proc/my/entry)。

关于这种奇怪行为的任何线索不是我发现的许多教程中声称的吗?

顺便说一句,我在 64 位系统上使用 RHEL5 内核(2.6.18,redhat 修改)。

谢谢。

问候,

亚尼克

【问题讨论】:

    标签: linux-kernel kernel


    【解决方案1】:

    不允许release() 导致close() 失败。

    如果你的用户空间程序想要找出所有可能的错误,你可以要求你的用户空间程序在close()之前调用文件描述符上的fsync();然后在 fsync() 处理程序中实现最终错误检查。

    【讨论】:

    • 感谢您的回答。它证实了我从其他来源看到的。奇怪的是,在网上找到的几个教程使用返回的值就好像它是一个错误代码(即通过返回 -EBUSY 或其他错误代码)。我更改了代码以处理 write() 函数(传播错误)中的大多数错误情况。我将查看其余的 fsync() 调用。谢谢,-- 亚尼克
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-02-03
    • 2018-05-12
    • 2017-02-06
    • 2020-12-18
    • 1970-01-01
    相关资源
    最近更新 更多