关闭

内核和用户空间的消息传递-事件通知 (2)

标签: 内核 用户 通知
555人阅读 评论(0) 收藏 举报
分类:

事件通知机制不仅可用户用户态两个线程之间同步,还可以用于内核空间和用户空间同步。


方法如下:

1.在用户层

a. 创建一个文件描述符

int event_fd = -1;

event_fd = eventfd ( 0, EFD_NONBLOCK | EFD_SEMAPHORE );


b.将文件描述符通过ioctl传递给内核 

enable_message_notification_info.event_fd       = event_fd;

ioctl ( fmb_fd, FMB_API_ENABLE_MESSAGE_NOTIFICATION, &enable_message_notification_info );


c.将事件通知的文件描述符,加入文件描述集,然后用select监控

fd_set read_fds;

while(1)

{

//.将这个文件描述符加入set,然后select监控队列

FD_ZERO ( &read_fds );
FD_SET ( event_fd , &read_fds );

result = select ( max_fd + 1, &read_fds, NULL, NULL, NULL );

。。。

// 如果有事件触发

if ( FD_ISSET ( message_thread_param_p->fd_receive_message_notification, &read_fds ) )

 {
  uint32_t message_id;
  uint32_t message_param[FMB_MESSAGE_PARAM_SIZE];

  //清空
  result = eventfd_read ( message_thread_param_p->fd_receive_message_notification, &eventfd_value );
  ASSERT_APP ( result == 0, "ERR: eventfd_read" );

 //事件处理     

 ...  ... 

}

}


2.在内核空间:

a. 通过ioctl得到文件描述符,转换为eventfd_ctx

struct eventfd_ctx* eventfd_ctx_p;

eventfd_ctx_p = eventfd_ctx_fdget ( event_fd );


b.在需要发送消息的地方调用以下接口:

eventfd_signal ( queue_p->notification_info.eventfd_ctx_p, 1 );


c.回收这个消息的资源

eventfd_ctx_put ( queue_p->notification_info.eventfd_ctx_p );

0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:27195次
    • 积分:725
    • 等级:
    • 排名:千里之外
    • 原创:45篇
    • 转载:11篇
    • 译文:0篇
    • 评论:6条
    最新评论