procfs读写信息实例

       procfs是比较老的一种用户态与内核态的数据交换方式,内核的很多数据都是通过这种方式出口给用户的,内核的很多参数也是通过这种方式来让用户方便设置的。

struct proc_dir_entry *create_proc_entry(const char *name, mode_t mode,
					 struct proc_dir_entry *parent)

       该函数用于创建一个正常的proc条目,参数name给出要建立的proc条目的名称,参数mode给出了建立的该proc条目的访问权限,参数parent指定建立的proc条目所在的目录。如果要在/proc下建立proc条目,parent应当为NULL。

/*
 * Remove a /proc entry and free it if it's not currently in use.
 */
void remove_proc_entry(const char *name, struct proc_dir_entry *parent)

        该函数用于删除上面函数创建的proc条目,参数name给出要删除的proc条目的名称,参数parent指定建立的proc条目所在的目录。

struct proc_dir_entry {
     ……
	read_proc_t *read_proc; /* 读接口 */
	write_proc_t *write_proc; /* 写接口 */……
};

      procfs读写信息实例:

/**********************************************
 * Author: lewiyon@hotmail.com
 * File name: proc_sample.c
 * Description: create a file "proc_example" in the /proc, 
 *              which allows both input and output.
 * Date: 2011-12-12
 *********************************************/

#include <linux/kernel.h>	/* We're doing kernel work */
#include <linux/module.h>	/* Specifically, a module */
#include <linux/proc_fs.h>	/* Necessary because we use proc fs */
#include <asm/uaccess.h>	/* for get_user and put_user */

#define MSG_LEN 10
#define PROC_NAME "sample"

char chflag[MSG_LEN] = "sample"; 

static struct proc_dir_entry *sample;

/**
 * proc_read_data()
 * @page - buffer to write the data in
 * @start - where the actual data has been written in page
 * @offset - same meaning as the read system call
 * @count - same meaning as the read system call
 * @eof - set if no more data needs to be returned
 * @data - pointer to our soft state
 */
static int proc_read_rwdata(char *page, char **stat, off_t off,
                          int count, int *eof, void *data)
{
    int len;
    len = sprintf(page,"%s\n", chflag);
    return len;
}

static int proc_write_rwdata(struct file *file, const char __user *buf,
                          unsigned long count, void *data)
{
    if (count > MSG_LEN)
        count = MSG_LEN;

    if (copy_from_user(&chflag, buf, count))
        return -EFAULT;
    
    return count;
}
/* 
 * 模块初始化 
 */
static int __init sample_init(void)
{	
    int ret = 0;
    
    /*
     * create_proc_entry(name, mode,parent)
     * 在parent对应的目录下创建name文件
     * 返回目录对应的proc_dir_dentry
     */
    sample = create_proc_entry(PROC_NAME, 0644, NULL);	
    if (NULL == sample) {
        ret = -ENOMEM;	
        goto sample_err;
    }
    sample->read_proc = &proc_read_rwdata,
    sample->write_proc = &proc_write_rwdata,

    printk(KERN_INFO "Create sample\n"); 
    return ret;

sample_err:
    return ret;
}

/*
 * 模块清理
 */
static void __exit sample_exit(void)
{
    remove_proc_entry(PROC_NAME, NULL);
    printk(KERN_INFO "Remove /proc/proc_sample\n");
}

module_init(sample_init);
module_exit(sample_exit);
MODULE_LICENSE("GPL");
MODULE_AUTHOR("lewiyon <lewiyon@hotmail.com>");

 

      

### 如何清空 AutoDL 数据盘的数据 为了有效管理并清空 AutoDL 数据盘中的数据,可以采取以下几种方式: #### 方法一:使用 `rm` 命令删除指定文件夹下的所有内容 当尝试通过 Linux 删除命令来移除特定文件夹及其内部的内容时,可采用如下指令: ```bash rm -rf /root/autodl-tmp/noval ``` 这条命令会强制递归地删除 `/root/autodl-tmp/noval` 路径下的所有子目录和文件[^1]。 #### 方法二:查看并按需清理大体积文件或缓存 对于想要了解当前工作目录内各项目占用空间情况的情况,可以通过运行下面的命令获取信息,并据此决定哪些项应该被清理掉: ```bash du -sh .[!.]* * | sort -hr ``` 此命令能够显示各个条目的大小,并按照降序排列,便于识别占用了较多存储资源的对象。接着可以根据实际情况选择要删除的目标[^2]。 #### 方法三:进入 autodl-tmp 并检查其结构 如果目标是清理整个 `autodl-tmp` 下面的数据,则建议先切换至该位置再做进一步操作: ```bash cd /root/autodl-tmp/ du -h --max-depth=1 . ``` 上述命令不仅改变了当前的工作路径,还列出了根目录下每一层子目录所占据的空间总量,有助于评估接下来的动作范围[^3]。 #### 特殊注意事项 - **确认备份重要资料**:在执行任何大规模删除之前,请务必确保已经妥善保存了重要的研究数据或其他不可替代的信息。 - **谨慎处理全局权限更改**:除非绝对必要,在修改系统级设置或是赋予过高权限给某些进程前应格外小心,以免影响系统的稳定性和安全性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

YoungerChina

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值