免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
1234下一页
最近访问板块 发新帖
查看: 11816 | 回复: 30
打印 上一主题 下一主题

怎么在内核级实现字符串追加 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2011-02-16 22:28 |只看该作者 |倒序浏览
怎么通过file_operations 结构中write 函数实现追加呢?
就是在内存开辟一块空间,然后通过wirte函数从用户空间读取数据写入,现在可以
echo abcd >/proc/mydir/pool
cat /proc/mydir/pool
abcd
但是怎么实现
echo abcd >/proc/mydir/pool
echo abcd >>/proc/mydir/pool
cat /proc/mydir/pool
abcdabcd
????
代码如下:
  1. #include <linux/module.h>
  2. #include <linux/proc_fs.h>
  3. #include <asm/uaccess.h>

  4. static struct proc_dir_entry *mydir;
  5. static struct proc_dir_entry *pfile;
  6. MODULE_LICENSE("Dual BSD/GPL");

  7. static char msg[255];

  8. static int myproc_read(char *page, char **start, off_t off, int count, int *eof, void *data)
  9. {
  10.         int len = strlen(msg);

  11.         if (off >= len)
  12.                 return 0;

  13.         if (count > len - off)
  14.                 count = len - off;

  15.         memcpy(page + off, msg + off, count);
  16.         return off + count;
  17. }

  18. static int myproc_write(struct file *file, const char __user *buffer, unsigned long count, void *data)
  19. {
  20.         unsigned long count2 = count;

  21.         if (count2 >= sizeof(msg))
  22.                 count2 = sizeof(msg) - 1;

  23.         if (copy_from_user(msg, buffer, count2))
  24.                 return -EFAULT;

  25.         msg[count2] = '\0';
  26.         return count;
  27. }

  28. static int __init myproc_init(void)
  29. {
  30.         mydir = proc_mkdir("mydir", NULL);
  31.         if (!mydir) {
  32.                 printk(KERN_ERR "Can't create /proc/mydir\n");
  33.                 return -1;
  34.         }

  35.         pfile = create_proc_entry("pool", 0666, mydir);
  36.         if (!pfile) {
  37.                 printk(KERN_ERR "Can't create /proc/mydir/pool\n");
  38.                 remove_proc_entry("mydir", NULL);
  39.                 return -1;
  40.         }

  41.         pfile->read_proc = myproc_read;
  42.         pfile->write_proc = myproc_write;

  43.         return 0;
  44. }

  45. static void __exit myproc_exit(void)
  46. {
  47.         remove_proc_entry("pool", mydir);
  48.         remove_proc_entry("mydir", NULL);
  49. }

  50. module_init(myproc_init);
  51. module_exit(myproc_exit);
复制代码

论坛徽章:
0
2 [报告]
发表于 2011-02-16 22:48 |只看该作者
高手都睡觉了。。。??

论坛徽章:
0
3 [报告]
发表于 2011-02-16 22:55 |只看该作者
自己搞定了

论坛徽章:
0
4 [报告]
发表于 2011-02-17 09:05 |只看该作者
本帖最后由 tubocurarine 于 2011-02-17 09:32 编辑

copy_from_user() 之前检查一下现有的 msg 长度,计算出偏移量 offset,最后用 msg+offset 做为 copy_from_user() 的地址就可以了吧。
当然, copy_from_user() 之前要检查这个 offset 会不会越界。

论坛徽章:
0
5 [报告]
发表于 2011-02-17 10:19 |只看该作者
但是,怎么知道是echo > 还是echo >>呢??
debian上可以 ,ubuntu上还是不行

继续求助

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
6 [报告]
发表于 2011-02-17 10:33 |只看该作者
真土

论坛徽章:
0
7 [报告]
发表于 2011-02-17 10:35 |只看该作者
呵呵,给俺个不土的吧

论坛徽章:
0
8 [报告]
发表于 2011-02-17 10:41 |只看该作者
版主你别光说不练啊O(∩_∩)O~

论坛徽章:
3
2015年迎新春徽章
日期:2015-03-04 09:56:11数据库技术版块每日发帖之星
日期:2016-08-03 06:20:00数据库技术版块每日发帖之星
日期:2016-08-04 06:20:00
9 [报告]
发表于 2011-02-17 10:50 |只看该作者
每次你都write到msg这个地址上去了,覆盖一次又一次...
建议用循环队列这样的数据结构,
另外,msg建议用动态分配,并且可以不断扩大

论坛徽章:
0
10 [报告]
发表于 2011-02-17 10:58 |只看该作者
  1. static int myproc_write( struct file *filp,const char *buf,
  2.                               size_t count, loff_t *f_pos)
  3. {
  4.     unsigned long liret = -1;
  5.     size_t linum = count > BUFF_SIZE? BUFF_SIZE : count;
  6.     //liret = copy_from_user(memory_buffer,tmp,1);
  7.     if(*f_pos == 0)
  8.     {
  9.         liret = copy_from_user(memory_buffer,buf, linum);
  10.         printk(KERN_EMERG "memory_write->if\n");
  11.     }
  12.     else
  13.     {
  14.         liret = copy_from_user(memory_buffer + strlen(memory_buffer), buf, linum - strlen(memory_buffer));
  15.         printk(KERN_EMERG "memory_write->else\n");
  16.     }
  17.     printk(KERN_EMERG "memory_write count:%d\n",  count);

  18.     return linum;
  19. }
复制代码
我这样在debian上可以的,Ubuntu就不行了
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP