- 论坛徽章:
- 0
|
我写了个简单的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下写的程序没有碰到这样的问题!已经卡了好久了,真是非常之郁闷。谢谢大家了! |
|