LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 1204|回复: 7

提问:怎么在自己编写的模块中使用系统调用(2.4.20)

[复制链接]
发表于 2006-1-6 14:03:03 | 显示全部楼层 |阅读模式
我想用read、write的系统调用,可是总是说这两个系统调用的名字无法识别。
发表于 2006-1-7 09:11:26 | 显示全部楼层
是可以用的,不过不能直接用这几个函数名,在 init/main.c 中调用了系统调用 dup ,从中可以看到:

* 不能直接使用系统调用原名,main.c 中用的是 (void) sys_dup(0);
回复 支持 反对

使用道具 举报

发表于 2006-1-8 14:04:38 | 显示全部楼层
要用_syscall0      ~   _syscall6
这几个宏先定义一下的,自己google一下这几个宏吧
回复 支持 反对

使用道具 举报

 楼主| 发表于 2006-1-8 14:11:50 | 显示全部楼层
这个活放下了好久了~~哪天试试~~谢谢你~~~
回复 支持 反对

使用道具 举报

发表于 2006-1-11 12:38:08 | 显示全部楼层
就是有!在核心态调用也不会成功!核心没有描述符!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2006-1-11 13:18:11 | 显示全部楼层
那怎么办呢?
回复 支持 反对

使用道具 举报

发表于 2006-1-11 13:54:40 | 显示全部楼层
那就自己动手,丰衣足食
自己调用 file_open 获取 file 结构,然后:

  1. loff_t pos = file_pos_read(file);
  2. ret = vfs_write(file, buf, count, &pos);
  3. file_pos_write(file, pos);
  4. fput_light(file, fput_needed);
复制代码


不过这样很危险,因为很有可能睡眠。可以考虑交给工作队列(workqueue)或者自己创建内核线程
回复 支持 反对

使用道具 举报

发表于 2006-4-19 09:40:39 | 显示全部楼层
首先 在文件中包含#define __KERNEI_SYSCALLS__ 也可以在编译选项中添加

还要包含#include <linux/unistd.h>
必须自定义一个 int error;

/*
#include <asm/access.h>
#include <asm/process.h>
#include <linux/fs.h>
#include <linux/file.h>*/是否必要,不清楚,我用的时候一律全加上了,呵呵

mm_segment_t old_fs = get_fs();
set_fs(KERNELK_DS);

...................//调用read write函数

set_fs(old_fs);
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表