Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linux 如何删除字符设备中的数据_Linux_Linux Kernel_Linux Device Driver - Fatal编程技术网

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

Linux 如何删除字符设备中的数据,linux,linux-kernel,linux-device-driver,Linux,Linux Kernel,Linux Device Driver,我已经在/dev/my_char中将一些数据写入了我的字符设备。 在不从内核中删除设备的情况下,我应该如何删除数据 我删除内容的方法是 1) rm/dev/my_char和 2) rmmod My_Char 但是通过使用这种方法,我必须将模块再次插入内核,并在dev文件夹中创建设备,这是一个漫长的过程 仅使用rm/dev/my_char不会删除其内容 我想知道除此之外是否还有其他方法。您可以像处理通用文件一样处理字符设备 cat/dev/null>/dev/my\u char 只需从内核中删除模

我已经在
/dev/my_char
中将一些数据写入了我的字符设备。 在不从内核中删除设备的情况下,我应该如何删除数据

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

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

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


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

您可以像处理通用文件一样处理字符设备

cat/dev/null>/dev/my\u char

只需从内核中删除模块,然后再次将模块加载到内核,即可删除设备中的数据。即“rmmod My_Char”和“insmod My_Char”。通过此方法,我们无需在/dev/my_字符中再次创建设备,因为它将自动加载,而不包含任何数据。

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

  • 将ioctl处理程序添加到驱动程序
  • 将入口点添加到文件操作结构中
    .unlocked\u ioctl=
    (您的函数名)
  • 对于正确的ioctl命令,请重置缓冲区指针、清除计数或任何使设备看起来为空的操作
  • 或者您可以编写一个脚本来删除驱动程序并重新加载它。下面是我使用的(我称之为重新加载):


    0>/dev/my_char
    :这会在文件中写入
    0
    /dev/my\u char
    应该清除它。@brokenfoot 0>/dev/my\u char不工作,因为有一个错误bash:0:找不到命令,因为只提供>/dev/my\u char没有清除数据。V.Alexeev提到的命令没有清除/dev/mychar中的数据。然后,您应该查看设备驱动程序代码。这与shellV.ALexeev无关。我认为这与驱动程序代码无关,因为该设备是在命令窗口中使用mknod/dev/my_char c 251 0创建的。因此,我也应该能够删除其中的内容。如果我错了,请纠正我。与块设备字符设备通常没有随机访问功能不同。在大多数情况下,对字符设备的读写数据没有缓冲。所以您不能从/dev/my_char中删除数据。你只能读或写。字符设备的典型示例有:磁带机、调制解调器或TTY终端。发送的数据。。。他被派去了。没有删除的方法删除设备中的数据是可能的,只需从内核中删除模块,然后再次将模块加载到内核。即“rmmod My_Char”和“insmod./My_Char.ko”。通过这种方法,我们不需要在/dev/My_Char中再次创建设备,因为它将自动加载其中的空数据。
    #!/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