免费注册 查看新帖 |

Chinaunix

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

kld 编程问题 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2004-10-13 17:45 |只看该作者 |倒序浏览
我写了个简单的character devices 的程序,ioctl时总是出错!希望大家给看看哪里错了!
#include <sys/types.h>;
#include <sys/module.h>;
#include <sys/ioccom.h>;
#include <sys/errno.h>;
#include <sys/param.h>;
#include <sys/kernel.h>;
#include <sys/conf.h>;
#include <sys/uio.h>;
#include <sys/systm.h>;

#define GET_MSG _IOR('G',0,char *)
#define SET_MSG _IOW('G',1,char *)

d_open_t test_open;
d_close_t test_close;
d_ioctl_t test_ioctl;

static struct cdevsw test_cdevsw={
.d_open=test_open,
.d_close=test_close,
.d_ioctl=test_ioctl,
.d_name="testdev",
.d_maj=33
};


static char buf[512];
static int len;

static dev_t iodev;

static int loader(struct module *m,int cmd,void *arg)
{
int err=0;
switch(cmd){
case MOD_LOAD:
iodev=make_dev(&test_cdevsw,0,UID_ROOT,GID_WHEEL,0600,"testdev";
printf("testdev load success\n";
break;
case MOD_UNLOAD:
destroy_dev(iodev);
printf("testdev unload success\n";
break;
default:
err=EINVAL;
break;
}
return(err);
}

int test_open(dev_t dev,int oflags,int devtype,struct proc *p)
{
uprintf("open testdev \n";
return (0);
}

int test_close(dev_t dev,int fflag,int devtype,struct proc *p)
{
uprintf("close testdev \n";
return (0);
}

int test_ioctl(dev_t dev,u_long cmd,caddr_t data,int fflag,struct proc *p)
{
int err=0;
char *temp;
int len=0;
switch(cmd){
case GET_MSG:
{
temp=(char *)data;
err=copyout(buf,temp,strlen(buf));

if(err!=0){uprintf("kernel copyout error\n";}
break;
}
case SET_MSG:
{
temp=(char *)data;
err=copyin(temp,buf,512);

if(err=!0){uprintf("kernel copyinstr error \n";}
break;
}
}
return (err);
}

DEV_MODULE(testdev,loader,NULL);

下面是调用ioctl的简单程序
#include <fcntl.h>;
#include <sys/errno.h>;
#include <sys/ioccom.h>;
#include <sys/ioctl.h>;

#define GET_MSG _IOR('G',0,char *)
#define SET_MSG _IOW('G',1,char *)

int main()
{
int fd=0;
int err=0;
char msg[]="this is test msg";
char res[512];
fd=open("/dev/testdev",0);
err=ioctl(fd,SET_MSG,msg);
if(err<0)printf("ioctl 1 error:%d\n",errno);
err=ioctl(fd,GET_MSG,res);
if(err<0)printf("ioctl 2 error:%d\n",errno);
printf("get msg is %s\n",res);
}

copyout copyin总是出错,原来在linux下写的程序没有碰到这样的问题!已经卡了好久了,真是非常之郁闷。谢谢大家了!
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP