免费注册 查看新帖 |

Chinaunix

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

请教模块中sys_read()等几个文件操作的系统调用的用法 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2007-05-25 16:22 |只看该作者 |倒序浏览
我在用户空间使用函数fsanf()来读取文本文件的内容是这样:

fscanf(fp,"\n");

来读取文件中的回车。


fscanf(fp,"%s",buf);
把fp中的一个字符串赋值给buf,但是类似这样的功能在内核中用sys_read()怎么实现 ??

有有关sys_open(),sys_close(),sys_read(),sys_wrtie()这几个系统调用的使用的资料嘛?

论坛徽章:
0
2 [报告]
发表于 2007-05-25 16:38 |只看该作者
直接用sys_read或者kernel_read函数吧, 内核中没有用户层那么方便。

论坛徽章:
0
3 [报告]
发表于 2007-05-25 16:56 |只看该作者
谢谢版主
用哪个都行,我想知道用法,能举个例子告诉我这几个函数的用法么?:)

论坛徽章:
0
4 [报告]
发表于 2007-05-25 17:13 |只看该作者
原帖由 hongmy525 于 2007-5-25 16:56 发表于 3楼  
谢谢版主
用哪个都行,我想知道用法,能举个例子告诉我这几个函数的用法么?:)


用cscoped的f c kernel_read, 查得结果如下:
Cscope tag: kernel_read
#   line  filename / context / line
1    446  linux-2.6.20/arch/x86_64/ia32/ia32_aout.c <<load_aout_library>>
error = kernel_read(file, 0, (char *) &ex, sizeof(ex));
2     69  linux-2.6.20/fs/9p/trans_fd.c <<v9fs_fd_read>>
ret = kernel_read(ts->rd, ts->rd->f_pos, v, len);
3    475  linux-2.6.20/fs/binfmt_aout.c <<load_aout_library>>
error = kernel_read(file, 0, (char *) &ex, sizeof(ex));
4    350  linux-2.6.20/fs/binfmt_elf.c <<load_elf_interp>>
retval = kernel_read(interpreter, interp_elf_ex->e_phoff,
5    588  linux-2.6.20/fs/binfmt_elf.c <<load_elf_binary>>
retval = kernel_read(bprm->file, loc->elf_ex.e_phoff,
6    639  linux-2.6.20/fs/binfmt_elf.c <<load_elf_binary>>
retval = kernel_read(bprm->file, elf_ppnt->p_offset,
7    694  linux-2.6.20/fs/binfmt_elf.c <<load_elf_binary>>
retval = kernel_read(interpreter, 0, bprm->buf,
8   1065  linux-2.6.20/fs/binfmt_elf.c <<load_elf_library>>
retval = kernel_read(file, 0, (char *)&elf_ex, sizeof(elf_ex));
9   1089  linux-2.6.20/fs/binfmt_elf.c <<load_elf_library>>
retval = kernel_read(file, elf_ex.e_phoff, (char *)eppnt, j);
10    138  linux-2.6.20/fs/binfmt_elf_fdpic.c <<elf_fdpic_fetch_phdrs>>
retval = kernel_read(file, params->hdr.e_phoff,
11    216  linux-2.6.20/fs/binfmt_elf_fdpic.c <<load_elf_fdpic_binary>>
retval = kernel_read(bprm->file,
12    245  linux-2.6.20/fs/binfmt_elf_fdpic.c <<load_elf_fdpic_binary>>
retval = kernel_read(interpreter, 0, bprm->buf,
13    195  linux-2.6.20/fs/binfmt_misc.c <<load_misc_binary>>
retval = kernel_read(bprm->file, 0, bprm->buf, BINPRM_BUF_SIZE);
14    217  linux-2.6.20/fs/binfmt_som.c <<load_som_binary>>
retval = kernel_read(bprm->file, som_ex->aux_header_location,
15    536  linux-2.6.20/fs/coda/dir.c <<coda_venus_readdir>>
ret = kernel_read(filp, filp->f_pos - 2, (char *)vdir,
16    951  linux-2.6.20/fs/exec.c <<prepare_binprm>>
return kernel_read(bprm->file,0,bprm->buf,BINPRM_BUF_SIZE);

可以参考这些地方对kernel_read的使用方法

论坛徽章:
0
5 [报告]
发表于 2007-05-25 17:16 |只看该作者
我猜LZ在一个东西,哈哈。

论坛徽章:
0
6 [报告]
发表于 2007-05-25 17:33 |只看该作者
原帖由 圆点坐标 于 2007-5-25 17:16 发表于 5楼  
我猜LZ在一个东西,哈哈。

????上面意思啊?

论坛徽章:
0
7 [报告]
发表于 2007-05-25 17:38 |只看该作者
刚才在CSDN搜到说

想在linux的内核模块中对文件进行打开读写等操作,可以实现吗?

都说不行,这是真的嘛??

论坛徽章:
0
8 [报告]
发表于 2007-05-25 17:47 |只看该作者
可以实现, 本版精华区就有代码, 耐心找找。  刚才说的kernel_read是首选方法。

论坛徽章:
0
9 [报告]
发表于 2007-05-25 17:53 |只看该作者

论坛徽章:
0
10 [报告]
发表于 2007-05-25 18:09 |只看该作者
原帖由 albcamus 于 2007-5-25 17:47 发表于 8楼  
可以实现, 本版精华区就有代码, 耐心找找。  刚才说的kernel_read是首选方法。


我想请教一下为什么我用sys_open()的时候编译可以通过,而在加载的时候却出现了sys_write Unknown symbol in module的错误.
这是我的代码,请大家指教一下.谢谢!

  1. #include<linux/kernel.h>
  2. #include<linux/module.h>
  3. #include<linux/init.h>
  4. #include<linux/fs.h>
  5. #include<linux/string.h>
  6. #include<linux/syscalls.h>
  7. #include<asm/unistd.h>
  8. #include<asm/uaccess.h>

  9. int fd;
  10. static int __init init(void)
  11. {
  12.         char buf[10] = "hello";
  13.         fd = sys_open("/root/myfile", O_RDWR|O_CREAT, 0644);
  14.         if (fd < 0)
  15.         {
  16.                 printk("error\n");
  17.                 return -1;
  18.         }
  19.         sys_write(fd, buf, sizeof(buf));
  20.         return 0;
  21. }

  22. static void __exit exit(void)
  23. {
  24.         if (fd != 0)
  25.                 sys_close(fd);
  26. }

  27. module_init(init);
  28. module_exit(exit);
  29. MODULE_LICENSE("GPL");

复制代码
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP