eventfd与线程间通信
eventfd是linux新加入的API(自2.26.22), 为用户空间的应用程序提供等待(wait)/通知(notify)机制, 函数eventfd创建的fd可以加入epoll。函数原型:1. int eventfd(unsigned int initval, int flags); (1) return: fd, error -1; (2)initval:
一. evenfd介绍
eventfd是linux新加入的API(自2.26.22), 为用户空间的应用程序提供等待(wait)/通知(notify)机制, 函数eventfd创建的fd可以加入epoll。函数原型:
1. int eventfd_read(int fd, eventfd_t *val); eventfd_t 是64位
2. int eventfd_write(int fd, eventfd_t val); 此处的val值由调用者指定
3. int eventfd(unsigned int initval, int flags);
(1) return: fd, error -1;
(2) initval: 见下面;
(3) flags : EFD_CLOEXEC, 没玩过,不解释;
EFD_NONBLOCK, 设置fd为 非阻塞,省去使用fcntl的麻烦;
EFD_SEMAPHORE, 如果没设置此标志位,eventfd_read的val值是前面所有evenfd_write写入val值的和
+ initval;如果设置此标志位,evenfd_read读一次val减1直到为0;
二. 用eventfd实现pthread通信
typedef struct tagMSG
{
void *pada;
}MSG_S;
/*
*/
int queue_create(void)
{
return eventfd(0, EFD_NONBLOCK | EFD_SEMAPHORE);
}
int queue_read(int iEvFd, MSG_S *pstMsg)
{
eventfd_t stVal;
return eventfd_read(iEvFd, &stVal);
}
int queue_write(int iEvFd, MSG_S *pstMsg)
{
eventfd_t stVal = 1;
return eventfd_write(iEvFd, stVal);
}
,,
更多推荐
所有评论(0)