测试POLL功能出现"Segmentation fault"的问题!

发布于 2022-09-18 18:40:51 字数 8466 浏览 20 评论 0

写了一段小程序来测试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 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(4

方觉久 2022-09-25 18:40:51

Segmentation fault -- 段错误。99%的情况都是由于非法指针操作引起的,楼主自己仔细检查吧。。。

懒的傷心 2022-09-25 18:40:51

感谢你的关注!
我找到了!谢谢!!!

梦中的蝴蝶 2022-09-25 18:40:51

什么问题,不能分享一下么?

面如桃花 2022-09-25 18:40:51

应该是 struct pollfd *fds;    是空指针的原因。

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文