无法写入/ dev / *文件

时间:2015-12-30 03:14:22

标签: linux bash shell linux-kernel linux-device-driver

我正在为Linux内核编写基本的char设备驱动程序。 为此,我考虑的代码流如下:

  1. alloc_chrdev_region() - >使用主要号码的动态分配
  2. class_create() - >在sysfs中创建设备类
  3. device_creat() - >在/ dev /
  4. 下创建设备
  5. cdv_init() - >初始化char设备结构
  6. cdev_add() - >在内核中添加我的设备结构
  7. 我在代码中添加了read,write,open,release方法。

    当我尝试在/ dev /下读取设备文件时,调用read方法。 但是当我尝试使用echo在/ dev / file上写入时会出现错误

      

    " bash:/ dev / scull:权限被拒绝"

    我已使用ls -l检查了文件的权限,并且我有权读取或写入此文件。

    我编写的每个设备驱动程序模块都会出现此问题。它在另一台机器上运行良好。

    我正在使用ubuntu 15.10,自定义编译内核4.3.0

    1. ls -l /dev/scull

      的结果
      crw------- 1 root root 247, 0 Dec 30 18:06 /dev/scull
      
    2. 我用来打开文件的确切命令

      $ sudo echo 54 > /dev/scull
      
    3. 开放实施的源代码

      ssize_t scull_write(struct file *filp, const char __user *buf, size_t count, loff_t *f_pos){
           pr_alert("Device Written\n");
           return 0;
      }
      
    4. 我在这里寻找的行为是,我应该能够在'Device Written'输出中看到dmesg吗?

4 个答案:

答案 0 :(得分:7)

我认为你通常不是bash shell的root用户。然后这个命令行

sudo echo 54 > /dev/scull

不是你的想法。该命令分两步执行:

  1. bash设置输出重定向,即尝试使用当前用户权限打开/dev/scull
  2. 执行命令sudo echo 54,而stdout已连接到文件。
  3. 由于您没有非root用户的写入权限,因此第一步失败,bash报告

      

    " bash:/ dev / scull:权限被拒绝"

    您必须已root才能设置输出重定向。因此执行

    sudo -i
    

    为您提供具有root权限的交互式shell。你可以执行

    echo 54 > /dev/scull
    

    在那个root shell中。

答案 1 :(得分:1)

我知道线程太旧而无法回答但是如果有人想要在不切换到root用户的情况下知道替代方法,这里是解决方案:

sudo bash -c 'echo "54" > /dev/my_dev'

答案 2 :(得分:1)

我想指出,在您的系统上,只有root(文件所有者)具有读/写权限。您的(普通)用户帐户还没有!因此,另一个(快速)解决方案是为所有用户提供读/写权限。

可能这不是最安全的解决方案!仅在您的测试环境中这样做!

sudo chmod a+rw /dev/scull

但是现在您可以使用用户帐户(没有sudo)测试模块了

echo "hello, world!" > /dev/scull
cat < /dev/scull

答案 3 :(得分:0)

您可以在使用命令

执行root操作时执行此操作
sudo su

然后进入/dev文件夹并输入您的命令(将数据保存到/dev/scull)。

cd /dev
echo 54 > scull