微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何根据用户请求删除 proc 条目?

如何解决如何根据用户请求删除 proc 条目?

通常 proc 条目在具有 __exit 属性函数内部删除。如何根据用户要求删除它? 我已经厌倦了在写回调中调用 remove_proc_entry,但是内核在那里崩溃了。 我不能只删除模块,因为它一次管理多个 proc 条目。我只想删除我要为其“删除”的那个。

static int my_write(struct file *file,const char __user *userbuff,size_t len,loff_t *ppos)                                                                                                                                                                                                                                   
{                                                                                                                                                                                                                                                                               
        struct  seq_file *seqf = file->private_data;                                                                                                                                                                                                                             
        struct *my_data = seqf->private;                                                                                                                                                                                                                                        
        char   *buff;                                                                                                                                                                                                                                                            
        int     retval;                                                                                                                                                                                                                                                          
                                                                                                                                                                                                                                                                                
        retval = -EINVAL;                                                                                                                                                                                                                                                       
                                                                                                                                                                                                                                                                                
        if (!userbuff || len > PAGE_SIZE)                                                                                                                                                                                                                                       
                return -EINVAL;                                                                                                                                                                                                                                                 
                                                                                                                                                                                                                                                                                
        buff = kzalloc((len + 1),GFP_KERNEL);                                                                                                                                                                                                                                  
        if (!buff)                                                                                                                                                                                                                                                              
                return -ENOMEM;                                                                                                                                                                                                                                                 
                                                                                                                                                                                                                                                                                
        if (copy_from_user(buff,userbuff,len))                                                                                                                                                                                                                                
                goto out;                                                                                                                                                                                                                                                       
                                                                                                                                                                                                                                                                                
        buff[len] = '\0';                                                                                                                                                                                                                                                       
                                                                                                                                                                                                                                                                                
        if (!strncmp("delete",buff,6)) {                                                                                                                                                                                                                                      
                /* Cannot use remove_proc_entry inside that write callback. */                                                                                                                                                                                                  
                retval = 0;                                                                                                                                                                                                                                                     
        }                                                                                                                                                                                                                                                                       
                                                                                                                                                                                                                                                                                
        if (!retval)                                                                                                                                                                                                                                                            
                retval = len;                                                                                                                                                                                                                                                   
        else                                                                                                                                                                                                                                                                    
                printk("Usage: echo delete > /proc/my_proc to delete that entry.\n");                                                                                                                                                                                          
                                                                                                                                                                                                                                                                                
        return retval;                                                                                                                                                                                                                                                          
}                                                                                                                                                                                                                                                                               
                                                                                                                                                                                                                                                                                
static const struct file_operations my_proc_fops = {                                                                                                                                                                                                                            
        .open    = my_proc_open,.read    = seq_read,.write   = my_write,.llseek  = seq_lseek,.release = single_release,};  

解决方法

谢谢!我是通过 schedule_work 完成的。

struct my_data {
    /* data */
    struct work_struct remove_proc_work;
};

static void remove_proc_work_handler(struct work_struct *work)                                                                                                                                                                                                                  
{                                                                                                                                                                                                                                                                               
        struct my_data *data;                                                                                                                                                                                                                                                  
                                                                                                                                                                                                                                                                                
        data = container_of(work,struct my_data,remove_proc_work);                                                                                                                                                                                                           
                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                            
        /* call remove_proc_entry */                                                                                                                                                                                                                                     
} 

static void init_data(struct my_data *data)
{
    /* init data */
    INIT_WORK(&data->remove_proc_work,remove_proc_work_handler);
}

static int my_write(struct file *file,const char __user *userbuff,size_t len,loff_t *ppos)                                                                                                                                                                                                                                   
{                                                                                                                                                                                                                                                                               
        struct  seq_file *seqf = file->private_data;                                                                                                                                                                                                                             
        struct *my_data = seqf->private;                                                                                                                                                                                                                                        
        char   *buff;                                                                                                                                                                                                                                                            
        int     retval;                                                                                                                                                                                                                                                          
                                                                                                                                                                                                                                                                                
        retval = -EINVAL;                                                                                                                                                                                                                                                       
                                                                                                                                                                                                                                                                                
        if (!userbuff || len > PAGE_SIZE)                                                                                                                                                                                                                                       
                return -EINVAL;                                                                                                                                                                                                                                                 
                                                                                                                                                                                                                                                                                
        buff = kzalloc((len + 1),GFP_KERNEL);                                                                                                                                                                                                                                  
        if (!buff)                                                                                                                                                                                                                                                              
                return -ENOMEM;                                                                                                                                                                                                                                                 
                                                                                                                                                                                                                                                                                
        if (copy_from_user(buff,userbuff,len))                                                                                                                                                                                                                                
                goto out;                                                                                                                                                                                                                                                       
                                                                                                                                                                                                                                                                                
        buff[len] = '\0';                                                                                                                                                                                                                                                       
                                                                                                                                                                                                                                                                                
        if (!strncmp("delete",buff,6)) {                                                                                                                                                                                                                                      
                /* Cannot use remove_proc_entry inside that write callback. */                          
                schedule_work(&data->remove_proc_work);                                                                                                                                                       
                retval = 0;                                                                                                                                                                                                                                                     
        }                                                                                                                                                                                                                                                                       
                                                                                                                                                                                                                                                                                
        if (!retval)                                                                                                                                                                                                                                                            
                retval = len;                                                                                                                                                                                                                                                   
        else                                                                                                                                                                                                                                                                    
                printk("Usage: echo delete > /proc/my_proc to delete that entry.\n");                                                                                                                                                                                          
                                                                                                                                                                                                                                                                                
        return retval;                                                                                                                                                                                                                                                          
}                                                                                                                                                                                                                                                                               
                                                                                                                                                                                                                                                                                
static const struct file_operations my_proc_fops = {                                                                                                                                                                                                                            
        .open    = my_proc_open,.read    = seq_read,.write   = my_write,.llseek  = seq_lseek,.release = single_release,};  

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?