当前位置:  技术问答>java/j2ee iis7站长之家

echo 8888888 > /proc/simple_proc 后死循环调用 write

    来源: 互联网  发布时间:2017-05-10

    本文导语:  按照 linux 内核驱动敲了个简单的例子, insmod simple_proc.ko 后 cat /proc/simple_proc 可以正常打印出 12345678 但 echo 88888888 > /proc/simple_proc  就会一直打印 “simple_proc_write() len:8 count:9 ret:0” 无法中断,感觉就是在...

按照 linux 内核驱动敲了个简单的例子,
insmod simple_proc.ko 后 cat /proc/simple_proc 可以正常打印出 12345678
但 echo 88888888 > /proc/simple_proc 
就会一直打印 “simple_proc_write() len:8 count:9 ret:0”
无法中断,感觉就是在一直调用 write 注册的 simple_proc_write 函数,何解?

Linux 内核 2.6.32-21-generic
例子中是有 proc_entry->owner = THIS_MODULE; 这句话,但是 2.6.32 中没有这个成员变量就删除了

#include 
#include 
#include 
#include 

#define DEV_NAME "simple_proc"

static struct proc_dir_entry *proc_entry;
static unsigned long val = 0x12345678;

ssize_t simple_proc_read(char *page, 
    char **start, off_t off, int count, int *eof, void *data)
{
    if (off > 0) {
        *eof = 1;
        return 0;
    }

    return sprintf(page, "%08lxn", val);
}

ssize_t simple_proc_write(struct file *filep, 
    const char __user *buff, unsigned long len, void *data)
{
    #define MAX_UL_LEN (unsigned long)8
    char k_buf[MAX_UL_LEN];
    char *endp;
    unsigned long new;
    int count = min(MAX_UL_LEN, len);
    int ret = 0;


    if (copy_from_user(k_buf, buff, count)) {
        ret = -EFAULT;
        goto err;
    } else {
        new = simple_strtoul(k_buf, &endp, 16);
        if (endp == k_buf) {
            ret = -EINVAL;
            goto err;
        }
    }
    val = new;

err:
    printk(KERN_EMERG "%s() len:%lu count:%d ret:%dn", 
           __func__, len, count, ret);
    return ret;
}

int __init simple_proc_init(void)
{
    proc_entry = create_proc_entry(DEV_NAME, 0666, NULL);
    if (NULL == proc_entry) {
        printk(KERN_INFO "Couldn't create proc entryn");
        goto err;
    } else {
        proc_entry->read_proc  = simple_proc_read;
        proc_entry->write_proc = simple_proc_write;
    }
    
    return 0;

err:
    return -ENOMEM;
}

void __exit simple_proc_exit(void)
{
    remove_proc_entry(DEV_NAME, NULL);
}

module_init(simple_proc_init);
module_exit(simple_proc_exit);

MODULE_AUTHOR("test, a@b.c");
MODULE_DESCRIPTION("A simple Module for showing proc");
MODULE_VERSION("V1.0");
MODULE_LICENSE("GPL");

|
真有着好事,楼主给俺吧。呵呵

    
 
 

您可能感兴趣的文章:

 
本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • echo $$的问题 ,echo $($test)这个不行
  • echo ’*’与echo *的执行结果有什么区别?为什么?
  • linux里echo $与linux echo $[]有什么区别?
  • echo `echo \\\z` 为什么输出是 \z
  • echo -e 与echo -n的区别,我们老师是不是说错了
  • echo把选项-e输出了?
  • echo到底怎么用?
  • echo -n不生效
  • 怎样在echo里面实现换行?
  • JavaScript 图像延迟加载库 Echo.js
  • echo 能回显多行内容吗?
  • echo换行回显
  • Makefile中使用echo的问题
  • shell脚本执行echo显示参数问题
  • echo $? 是什么意思?
  • shell里怎样把echo出来的东西放到变量中??
  • 这个echo的是什么意思
  • echo -n abcdef >/dev/memory什么意思??
  • echo $?为什么没有用
  • --------在stty -echo屏蔽回显后,如何重新获得回显?--------


  • 站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,