【问题标题】:The call-back function (scull_read) for read system call of a custum character device being called infinity times while reading using $cat [duplicate]用于读取自定义字符设备的系统调用的回调函数(scull_read)在使用 $cat 读取时被无限次调用 [重复]
【发布时间】:2020-04-04 23:28:03
【问题描述】:

我编写了一个字符设备驱动程序来切换两个 GPIO 引脚。读取设备,回调函数为scull_read()。设备打开、读取、写入和关闭的正常操作运行正常,如果我从 C 程序执行所有操作,但在使用 echo 从终端执行上述操作时cat,读取和写入的回调函数(scull_read()scull_write())被无限次调用。在这个阶段,停止进程的kill信号^cscull_write()不起作用。

已经有一个测试代码,名称为:strong text

你能帮我解决这个问题吗?

这是一个github链接:https://github.com/guruprasad-92/Device-Driver.git

【问题讨论】:

  • 检查 scull_read 和 scull_write 函数的返回值。这些函数应返回从输入“buf”处理的字节数。如果这些函数返回 0,则用户模式进程可能会尝试重复调用它,直到处理完 'count' 个字节。

标签: c linux-kernel linux-device-driver device-driver


【解决方案1】:

cat(可能是echo)将在循环中调用您的读取函数,并在您的读取函数返回0时终止,表明已到达文件末尾。 You can check the source here.

由您决定何时到达“文件结尾”。通常,这是通过在每次调用 read 函数时更新文件偏移量来完成的。 (这是你调用的参数f_pos。)

因此,您需要在scull_read 中执行类似*f_pos += count 的操作。然后,当程序在同一个文件上再次调用scull_read 时,您可以检查*f_pos 以确定是否还有数据要读取。如果没有数据要读取,scull_read 应该返回 0。

也许你会发现this很有用。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-17
    • 1970-01-01
    • 1970-01-01
    • 2015-10-12
    相关资源
    最近更新 更多