gpt4 book ai didi

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

转载 作者:IT王子 更新时间:2023-10-29 01:22:39 24 4
gpt4 key购买 nike

我已经在/dev/my_char 中向我的字符设备写入了一些数据。我应该怎么做才能在不从内核中删除设备的情况下删除数据? .

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

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

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

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

最佳答案

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

  1. 向驱动程序添加 ioctl 处理程序。
  2. 将入口点添加到 file_operations 结构。 .unlocked_ioctl =(你的函数名)
  3. 对于正确的 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

关于linux - 如何删除字符设备中的数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22397082/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com