我已经在/ dev / my_char中的字符设备中写了一些数据.
如何在不从内核中删除设备的情况下删除数据? .
我删除内容的方法是
1)rm / dev / my_char和
2)rmmod My_Char.
但是通过使用这种方法,我必须再次将模块插入到内核中并在dev文件夹中创建设备,这是一个漫长的过程.
仅使用rm / dev / my_char不会删除其内容.
我想知道除此之外是否还有其他方法.
解决方法:
您可以实现ioctl来重置输入缓冲区.
>将ioctl处理程序添加到驱动程序.
>将入口点添加到file_operations结构. .unlocked_ioctl =(你的函数名)
>对于正确的ioctl命令,重置缓冲区指针,清除计数或使设备看起来为空所需的任何内容.
或者您可以编写脚本来删除驱动程序并重新加载它.这是我使用的(我称之为重载):
#!/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=', and 'deviceid='"
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
标签:linux,linux-kernel,linux-device-driver
来源: https://codeday.me/bug/20190624/1279621.html