内核和用户空间的消息传递-事件通知 (2)
2016-06-01 09:56
876 查看
事件通知机制不仅可用户用户态两个线程之间同步,还可以用于内核空间和用户空间同步。
方法如下:
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 );
方法如下:
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 );
相关文章推荐
- SQL查询执行计划优化
- Android性能优化
- 关于楼层导航
- 可能是多线程的吧,没尝试这个类怎么样,有时间时候看看
- 笔记一:关于在Windows环境下使用cmd向mysql数据库中导入.sql数据表文件
- NaCl学习笔记: 环境搭建
- c# get post 的方法
- grep命令详解
- SIFT特征提取分析
- absent line number information
- 深入理解PHP之源码目录结构与功能说明
- windows tomcat项目更新及数据库备份脚本
- 我在Android开发中遇到的一些问题
- Chrome Native Client 简介
- Python tab 命令补全,以及 vim 补全
- 重新配置EM(单机)
- Code-Based Configuration (EF6 onwards)
- 书单(四)——《javascript语言精髓实践》
- lua 字符串操作--string库函数
- 模板匹配——在一幅图像中匹配与模板相似的单个或者多个目标