一. 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(0EFD_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);

}



,,

Logo

更多推荐