测试POLL功能出现"Segmentation fault"的问题!
写了一段小程序来测试POLL功能!
思路:首测试驱动端口为无阻塞写入/读取,无阻塞就进行读写.若驱动程序中的变量arry中有数据则不能写,此时,就当作为阻塞,如果arry变量中没有数据,此时不能读. 返回到应用程序中的revents如果是可写,那么就写入,如果是可读那么就去读取arry中数据.
不知道,这样的思路对不对!如果对的话,再执行的时候,出现"Segmentation fault"(内存出错)
望前辈指教!!!
一个写的测试程序:
#define DEV_NAME "/dev/signel"
int main()
{ int test_fd,ret;
int a=01;
struct pollfd *fds; 定义POLL结构指针!
test_fd=open(DEV_NAME,O_WRONLY); 以只写的方式打开!
if(test_fd<0)
{ printf("the file is opened fail!!\n");
}
else
{ fds->events=04;/*POLLOUT | POLLWRNORM*/ 原本期望出现的事件!
fds->fd=test_fd; 文件描述符
printf("the file is opened scuss!!!\n");
poll(fds,1,-1); //执行POLL!1个文件描述,直到事件发生阻塞进入等待列.(按理说,这里不应该这样来描述,)
if(fds->revents==fds->events)
{ printf("revents=%d\n",fds->revents);
printf("write a=%d\n",a);
write(test_fd,&a,sizeof(a));
printf("write data is scuss!!!\n");
}
printf("error:revents=%d the write is not ready!!!\n",fds->revents);
}
ret=close(test_fd);
if(ret)
{ printf("close is error ,ret=%d\n",ret);
}
else
{ printf("the file is closed,ret=%d\n",ret);
}
以下为驱动,只分析POLL程序!其它没有问题!
#define DEV_NAME "signel"
#define DEV_ID 110
static int arry;
wait_queue_head_t read_Monitor;
wait_queue_head_t write_Monitor;
struct semaphore sem;
static int signel_write(struct file *file,const char __user * buf,size_t count,loff_t *off)
{ printk("%i,%s\n",current->pid,current->comm);
if(down_interruptible(&sem))
{ return -ERESTARTSYS;
}
printk("write data....!!!\n");
if(copy_from_user(&arry,buf,count))
{ up(&sem);
return -EFAULT;
}
up(&sem);
return count;
}
static int signel_read(struct file *file,char __user * buf,size_t count,loff_t *off)
{ printk ("%i,%s\n",current->pid,current->comm);
if(down_interruptible(&sem))
{ return -ERESTARTSYS;
}
printk("read data....!!!\n");
if(copy_to_user(buf,&arry,count))
{ up(&sem);
return -EFAULT;
}
up(&sem);
return count;
}
static unsigned int signel_poll(struct file *file,struct poll_table_struct *wait)
{ unsigned int mask=0;
printk("mode=%s\n",(file->f_mode & FMODE_WRITE)? "write" : "read");
if(file->f_mode&FMODE_WRITE)
{ poll_wait(file,&write_Monitor,wait);
if(arry) //如果变量arry里面有数据则返回/要求数据不能将原来的覆盖.
{ return mask;
}
mask=POLLOUT | POLLWRNORM; // 没有返回可写标志
}
if(file->f_mode&FMODE_READ)
{ poll_wait(file,&read_Monitor,wait);
if(arry==0) // 如果变量arry里面无数据返回!程序本意要求有数据才返回.
{ return mask;
}
mask=POLLIN | POLLWRNORM; } //在数据返回可读标志.
return mask;
}
static struct file_operations signel_test = {
.write = signel_write,
.read = signel_read,
.poll = signel_poll,
};
static int __init init_signel(void)
{ int ret;
sema_init(&sem,1); /* 或者用init_MUTEX(&sem) 初始化并声明为互斥(实际上也就是将信号量为“1”也就是它互斥模式)*/
ret=register_chrdev(DEV_ID,DEV_NAME,&signel_test);
if(ret<0)
{ printk("registre is fail!!\n");
return ret;
}
else
{ printk("registre is scuss!!\n");
devfs_mk_cdev(MKDEV(DEV_ID,0),S_IFCHR | S_IRUSR | S_IWUSR,"signel");
return 0;
}
return 0;
}
static void __exit exit_signel(void)
{ unregister_chrdev(DEV_ID,DEV_NAME);
devfs_remove(DEV_NAME);
}
module_init(init_signel);
module_exit(exit_signel);
MODULE_LICENSE("GPL");
MODULE_AUTHOR("KANG");
MODULE_DESCRIPTION("SIGNE");
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(4)
Segmentation fault -- 段错误。99%的情况都是由于非法指针操作引起的,楼主自己仔细检查吧。。。
感谢你的关注!
我找到了!谢谢!!!
什么问题,不能分享一下么?
应该是 struct pollfd *fds; 是空指针的原因。