【问题标题】:"cat" command killed when reading from a Linux device driver从 Linux 设备驱动程序读取时“cat”命令被杀死
【发布时间】:2012-04-18 15:40:26
【问题描述】:

我在我的操作系统课程中有一个任务是制作一个简单的伪堆栈 Linux 设备驱动程序。例如,如果我要向设备驱动程序写入“Hello”,当我读取它时它会返回“olleH”。我们必须在 C 中构建一个测试程序来调用设备驱动程序的读/写函数来证明它以 FILO 方式运行。我已经完成了所有这些,我认为我的测试程序证明了任务的目的;但是,出于好奇,我在 BASH 中执行了以下命令:

echo "Test" > /dev/driver

cat /dev/driver

/dev/driver 是我使用“mknod”创建的特殊文件。但是,当我这样做时,我会得到一个充满错误的黑屏。在我使用 CNTRL+ALT+F7 切换回 GUI 视图后,我看到 BASH 已返回“Killed”。

有谁知道导致这种情况发生的原因是什么?我很困惑,因为我的测试程序调用了 open()、read() 和 write(),一切都正常运行。

如果我需要显示一些代码,请问。

【问题讨论】:

    标签: linux device-driver


    【解决方案1】:

    设备驱动程序中写入缓冲区的函数最有可能导致此问题。

    要调试,您可以执行以下操作:

    • 首先,确保读取部分正常。从输入中读取后,您可以printk您的内部缓冲区以确保这一点。

    • 其次,在您的写入函数中,printk 一些信息,而不是实际写入任何内容并确保一切正常。

    另外,请确保作者清楚地表明写入已结束。我不太确定设备驱动程序,但是您要么需要返回 0 作为第二次调用时写入的字节数,要么设置一个 eof 变量(如果这是您的函数的参数之一)

    【讨论】:

    • 我现在正在研究这个......我们在课堂上给出的示例仅根据函数返回 bytes_read 或 bytes_written。我理解的方式是,当 bytes_read 为 0 时,读取完成。我已经准备好这样做了,但显然有些不对劲。
    • 非常感谢!我能够使用 printk 并查看发生了什么。显然我需要在我的读取函数中进行额外的布尔测试。我在缓冲区中的读取位置超出了范围。但它现在固定了。再次感谢!
    • @StayPuff,没问题。内核错误可能会变得非常非常令人讨厌。我个人实际调试的唯一方法是打印出东西并失败。检查日志以查看到目前为止是否正常,如果是,请将日志进一步向前移动。很麻烦!
    猜你喜欢
    • 1970-01-01
    • 2018-12-30
    • 2014-01-27
    • 2019-07-19
    • 1970-01-01
    • 1970-01-01
    • 2013-01-16
    • 1970-01-01
    相关资源
    最近更新 更多