Chinaunix

标题: kld 编程问题 [打印本页]

作者: adifk    时间: 2004-10-13 17:45
标题: kld 编程问题
我写了个简单的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下写的程序没有碰到这样的问题!已经卡了好久了,真是非常之郁闷。谢谢大家了!




欢迎光临 Chinaunix (http://bbs.chinaunix.net/) Powered by Discuz! X3.2