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来重置输入缓冲区
.unlocked\u 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