我已经写了一些数据到我的字符设备在/dev/my_char
。 我应该如何删除数据而不从内核中删除设备? 。
删除内容的方法是1)rm /dev/my_char
和2)rmmod My_Char。
但是通过使用这种方法,我必须再次将模块插入到内核中,并在dev文件夹中创build设备,这是一个漫长的过程。
仅使用rm /dev/my_char
不会删除其内容。
我想知道是否还有其他方法。
你可以实现一个ioctl来重置输入缓冲区。
.unlocked_ioctl =
(你的函数名) 或者你可以写一个脚本来删除驱动程序并重新加载它。 这是我使用的(我称之为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
您可以像使用通用文件一样处理字符设备
cat /dev/null > /dev/my_char
可以通过从内核中删除模块来删除设备中的数据,然后再次将模块加载到kernel.ie“rmmod My_Char”和再次“insmod My_Char”。通过这种方法,我们不需要再次创建设备/ dev / my_char,因为它将被自动加载而没有数据。