免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
楼主: chary8088
打印 上一主题 下一主题

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

论坛徽章:
0
11 [报告]
发表于 2011-02-17 10:59 |只看该作者
myproc_write 函数赋值file_operations 结构中write函数指针

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



    另外,最土的事情莫过于此->居然把'\0'排除出了随机数据的范畴,当字符串看……

论坛徽章:
0
13 [报告]
发表于 2011-02-17 12:17 |只看该作者
confused..

论坛徽章:
0
14 [报告]
发表于 2011-02-17 12:18 |只看该作者
另外,最土的事情莫过于此->居然把'\0'排除出了随机数据的范畴,当字符串看……
cjaizss 发表于 2011-02-17 11:03


卖关子不顶用。。。

论坛徽章:
3
2015年迎新春徽章
日期:2015-03-04 09:56:11数据库技术版块每日发帖之星
日期:2016-08-03 06:20:00数据库技术版块每日发帖之星
日期:2016-08-04 06:20:00
15 [报告]
发表于 2011-02-17 12:27 |只看该作者
卖关子不顶用。。。
chary8088 发表于 2011-02-17 12:18



    我不是已经在前面帖子里说了导致你问题的原因和你如何修改吗?自己没看?

论坛徽章:
0
16 [报告]
发表于 2011-02-17 13:25 |只看该作者
又想了一下,可能真不能实现。

LZ 最初发的代码肯定是有问题,比如每次都从 msg 开始写,以及 msg 静态大小, 没有初始化 msg 等等。

但即便把上述问题都解决了,通过 echo "xxx" >> /proc/mydir/pool 这种方法来实现 “追加”可能也不会成功。

/proc 是一个虚拟文件系统,用户态的程序会将上面的文件都当作空文件来处理,看一下 /proc/mydir/pool 的一些信息:

  1. /tmp $ ls -lh /proc/mydir/pool
  2. -rw-rw-rw-   1 root           root            0  2月 17 13:18 /proc/mydir/pool
  3. /tmp $ stat /proc/mydir/pool
  4.   文件:"/proc/mydir/pool"
  5.   大小:0                 块:0          IO 块:1024   普通空文件
  6. 设备:3h/3d        Inode:4026532134  硬链接:1
  7. 权限:(0666/-rw-rw-rw-)  Uid:(    0/    root)   Gid:(    0/    root)
  8. 最近访问:2011-02-17 13:18:05.716000878 +0800
  9. 最近更改:2011-02-17 13:18:05.716000878 +0800
  10. 最近改动:2011-02-17 13:18:05.716000878 +0800
  11. 创建时间:-

  12. /proc $ file /proc/mydir/pool
  13. /proc/mydir/pool: empty
复制代码
可以看到, 用户空间的程序认为这是一空文件,那么通过 echo "xxx" >>  来向文件中追加字串的话,按照一般的想法, 应该会执行下面的步骤:

  1. 1. 打开文件,
  2. 2. 确定文件大小,并 lseek 到尾部,
  3. 3. 执行写入。
复制代码
由于用户态看到的文件大小为 0 , 所以 sys_write() 可能每次都会从 offset 0 开始写,所以对于  proc 文件系统下的文件, 无法实现追加。

但是如果 LZ 是对真实的一个文件来做的话,只要设计得当,应该不会出现上面的问题。

个人对 /proc 文件系统的实现没有太多了解,上述的推断是根据普通文件推断的,不一定准确,仅供参考。

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
17 [报告]
发表于 2011-02-17 13:48 |只看该作者
seek 啥呀,打开文件时有专门的 APPEND 选项的。

论坛徽章:
0
18 [报告]
发表于 2011-02-17 14:20 |只看该作者
又想了一下,可能真不能实现。

LZ 最初发的代码肯定是有问题,比如每次都从 msg 开始写,以及 msg 静态大 ...
tubocurarine 发表于 2011-02-17 13:25



我现在是不从proc实现了, 是从内存实现
mknod /dev/memory c 88 0
就是字符设备;
但是Debian可以,Ubuntu和radhat不行

论坛徽章:
0
19 [报告]
发表于 2011-02-17 16:29 |只看该作者
seek 啥呀,打开文件时有专门的 APPEND 选项的。
flw 发表于 2011-02-17 13:48


对,想起来了 ……

论坛徽章:
0
20 [报告]
发表于 2011-02-17 20:22 |只看该作者
对,想起来了 ……
tubocurarine 发表于 2011-02-17 16:29



  大哥,这是驱动程序
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP