如何删除字符设备中的数据

时间:2014-03-14 05:43:08

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

我已在/dev/my_char的个人设备中写了一些数据。 如何在不从内核中删除设备的情况下删除数据?

我删除内容的方法是 1)rm /dev/my_char和 2)rmmod My_Char。

但是通过使用这种方法,我必须再次将模块插入到内核中并在dev文件夹中创建设备,这是一个漫长的过程。

仅使用rm /dev/my_char不会删除其内容。

我想知道除此之外是否还有其他方法。

3 个答案:

答案 0 :(得分:2)

您可以实现ioctl来重置输入缓冲区。

  1. 向驱动程序添加ioctl处理程序。
  2. 将入口点添加到file_operations结构中。 .unlocked_ioctl =(您的函数名称)
  3. 对于正确的ioctl命令,重置缓冲区指针,清除计数或使设备看起来为空所需的任何内容。
  4. 或者您可以编写脚本来删除驱动程序并重新加载它。这是我使用的(我称之为reload):

    #!/bin/bash
    if [ -d /device/my_device ]; then
        sudo rmmod my_device.ko
    fi
    
    VERBOSE=0
    MESSAGES=0
    VENDOR=
    DEVICEID=
    
    while (( $# > 0 ))
    do
        arg="$1"
        shift
    
        case $arg in
        v=* | ve=* | ver=* | verb=* | verbo=* | verbos=* | verbose=*)
            VERBOSE=${arg#*=}
            ;;
    
        v | ve | ver | verb | verbo | verbos | verbose)
            VERBOSE=1
            ;;
    
        t  | tt | tty)
            MESSAGES=1
            ;;
    
        ven=* | vend=* | vendo=* | vendor=*)
            VENDOR="opt_vendor_id=${arg#*=}"
            ;;
    
        ven | vend | vendo | vendor)
            VENDOR="opt_vendor_id=$1"
            shift
            ;;
    
        d=* | de=* | dev=* | devi=* | devic=* | device=*)
            DEVICEID="opt_device_id=${arg#*=}"
            ;;
    
        d | de | dev | devi | devic | device)
            DEVICEID="opt_device_id=$1"
            shift
            ;;
    
        *)
            echo "Invalid option '$arg':"
            echo "Options are 'verbose', 'tty', 'vendor='<vendor number>, and 'deviceid='<device id>"
            exit 1
            ;;
        esac
    done
    
    echo "insmod my_device.ko opt_verbose=$VERBOSE opt_tty_msgs=$MESSAGES $VENDOR $DEVICEID"
    sudo insmod my_device.ko opt_verbose=$VERBOSE opt_tty_msgs=$MESSAGES $VENDOR $DEVICEID
    

    这有很多额外的复杂性来处理加载时传递给模块的参数。如果您没有任何模块参数,可以将上述内容简化为:

    #!/bin/bash
    if [ -d /device/my_device ]; then
        sudo rmmod my_device.ko
    fi
    
    sudo insmod my_device.ko
    

答案 1 :(得分:1)

您可以使用角色设备,就像它是通用文件一样

cat /dev/null > /dev/my_char

答案 2 :(得分:1)

可以通过从内核中删除模块然后再将模块再次加载到kernel.ie“rmmod My_Char”并再次“insmod My_Char”来删除设备中的数据。通过这种方法我们不需要创建设备再次出现在/ dev / my_char中,因为它将自动加载,没有数据。