我已在/dev/my_char
的个人设备中写了一些数据。
如何在不从内核中删除设备的情况下删除数据?
我删除内容的方法是
1)rm /dev/my_char
和
2)rmmod My_Char。
但是通过使用这种方法,我必须再次将模块插入到内核中并在dev文件夹中创建设备,这是一个漫长的过程。
仅使用rm /dev/my_char
不会删除其内容。
我想知道除此之外是否还有其他方法。
答案 0 :(得分:2)
您可以实现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
答案 1 :(得分:1)
您可以使用角色设备,就像它是通用文件一样
cat /dev/null > /dev/my_char
答案 2 :(得分:1)
可以通过从内核中删除模块然后再将模块再次加载到kernel.ie“rmmod My_Char”并再次“insmod My_Char”来删除设备中的数据。通过这种方法我们不需要创建设备再次出现在/ dev / my_char中,因为它将自动加载,没有数据。