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");
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.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。
本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。