libevent库源码学习-devpoll(/dev/poll)( linux)

1.初始化
使用
fd = open(“/dev/poll”, flags, (mode_t)mode);获得文件描述符

2.增加事件
struct pollfd *events;
pwrite(fd, events,sizeof(struct pollfd) * eventsnum, 0) 直接往里边写

3.删除事件
使用 POLLREMOVE 事件,然后把这个时间用增加时间的方法写入/dev/poll,系统会自动将我们要删除的描述符时间删除


4.监听事件

struct dvpoll {
        struct pollfd *dp_fds;
        int dp_nfds;
        int dp_timeout;
    }
struct dvpoll dvp;
res = ioctl(devpollop->dpfd, DP_POLL, &dvp);返回事件发生的个数

用个for遍历一遍即可
for (i = 0; i < res; i++) {
int which = 0;
int what = dvp.dp_fds[i].revents;

if (what & POLLHUP)
what |= POLLIN | POLLOUT;
else if (what & POLLERR)
what |= POLLIN | POLLOUT;

if (what & POLLIN)
which |= EV_READ;
if (what & POLLOUT)
which |= EV_WRITE;


if (!which)
continue;
。。。
}

<think> 我们有两个环境变量设置:LIBEVENT_LDFLAGS 和 LIBEVENT_LIBS,它们都包含了搜索路径,但用途不同。 1. **LIBEVENT_LDFLAGS**: - 主要用途:在链接阶段(linking)提供额外的标志(flags)给链接器(ld)。 - 具体内容:`-L$(PUBLIC_APPS_PATH)/libevent-2.1.12-stable/.libs` 告诉链接器在指定的目录中查找文件。 - 使用场景:通常用于设置搜索路径(-L)以及其他链接器选项(如-rpath等)。这里只设置了路径。 2. **LIBEVENT_LIBS**: - 主要用途:在链接阶段指定需要链接的具体- 具体内容:`-L$(PUBLIC_APPS_PATH)/libevent-2.12-stable/.libs -levent` 不仅指定了搜索路径(-L),还指定了要链接的-levent)。 - 使用场景:当编译一个依赖libevent的程序时,需要链接libevent,这个变量就提供了必要的链接选项。 区别总结: - `LIBEVENT_LDFLAGS` 只包含路径信息,不包含具体的。它用于设置链接器的搜索路径,但不指定链接哪个- `LIBEVENT_LIBS` 既包含路径信息(-L)又包含具体的-levent)。它用于直接指定链接的。 为什么同时存在? - 有些构建系统(如autoconf)可能会分别使用LDFLAGS和LIBS(或类似的变量)。LDFLAGS用于通用的链接器标志,而LIBS用于指定具体的- 在编译程序时,通常需要将两者都传递给编译器。例如: gcc $(LIBEVENT_CFLAGS) $(LIBEVENT_LDFLAGS) -o program program.c $(LIBEVENT_LIBS) 这里,头文件搜索路径(由LIBEVENT_CFLAGS提供)和搜索路径(由LIBEVENT_LDFLAGS提供)被分别传递,而具体的-levent)由LIBEVENT_LIBS提供。 注意:在有些情况下,LIBEVENT_LIBS已经包含了搜索路径(-L)和-l),那么单独使用LIBEVENT_LIBS可能就足够了。但分开设置可以提供更大的灵活性,比如当其他也需要不同的搜索路径时,可以将所有路径都放在LDFLAGS中,而将具体的放在LIBS中。 示例: 假设我们有两个libevent和libz,那么我们可以这样设置: LDFLAGS = -L/path/to/event -L/path/to/z LIBS = -levent -lz 然后编译命令: gcc $(LDFLAGS) -o test test.c $(LIBS) 在这个Makefile片段中,同时设置这两个变量可能是为了满足不同的构建需求,或者为了被其他组件的构建脚本所使用(比如通过pkg-config或类似的机制)。 §§相关问题§§ 1. 为什么在设置LIBEVENT_LIBS时重复指定了搜索路径(-L)? 2. 在什么情况下需要将搜索路径(-L)和链接-l)分开设置? 3. 如果只设置LIBEVENT_LIBS而不设置LIBEVENT_LDFLAGS,会有什么潜在问题? 4. 环境变量LIBEVENT_CFLAGS、LIBEVENT_LDFLAGS和LIBEVENT_LIBS通常会在哪些构建步骤中使用? </think> ### LIBEVENT_LDFLAGS 与 LIBEVENT_LIBS 的区别解析 #### 1. **核心作用对比** | 变量 | 作用域 | 主要功能 | 示例值 | |------|--------|---------|--------| | **LIBEVENT_LDFLAGS** | 链接器标志 | 指定的**搜索路径** | `-L/path/to/.libs` | | **LIBEVENT_LIBS** | 链接声明 | 指定**具体链接的文件** | `-L/path/to/.libs -levent` | #### 2. **LIBEVENT_LDFLAGS 详解** ```bash export LIBEVENT_LDFLAGS="-L$(PUBLIC_APPS_PATH)/libevent-2.1.12-stable/.libs" ``` - **功能定位**:纯路径指示器 - **关键参数**: - `-L`:指定链接器查找文件的目录 - **使用场景**:当其他构建系统(如 autoconf)需要知道位置但尚未确定具体链接哪个- **类比说明**:类似设置`PATH`环境变量,告诉系统"去哪里找程序",但不指定"运行哪个程序" #### 3. **LIBEVENT_LIBS 详解** ```bash export LIBEVENT_LIBS="-L$(PUBLIC_APPS_PATH)/libevent-2.1.12-stable/.libs -levent" ``` - **功能定位**:链接指令 - **关键参数**: - `-L`:搜索路径(与LDFLAGS重复但必要) - `-levent`:指定链接名为`libevent.so`的共享 - **实际作用**:直接提供给编译器的完整链接指令 - **等效命令**:`gcc main.c -L/path/.libs -levent` #### 4. **区别本质** ```mermaid graph TD A[编译过程] --> B[预处理] B --> C[编译] C --> D[汇编] D --> E[链接] E --> F[LDFLAGS作用域] E --> G[LIBS作用域] F --> H[提供搜索路径] G --> I[指定具体链接] ``` #### 5. **为什么要同时存在?** 1. **构建系统兼容性**: - Autotools 项目通常分开使用`LDFLAGS`和`LIBS` - CMake 项目可能更倾向使用`LIBS` 2. **灵活组合**: ```makefile # 应用场景1:仅需路径信息 $(CC) $(CFLAGS) -o test test.c $(LIBEVENT_LDFLAGS) # 应用场景2:需要完整链接 $(CC) $(CFLAGS) -o app app.c $(LIBEVENT_LIBS) ``` 3. **错误预防**: - 显式声明路径避免链接时找不到 - 显式声明名避免链接错误版本 #### 6. **典型使用案例** 在 configure 脚本中: ```bash # 检查是否存在 if test "x$enable_event" = xyes; then CPPFLAGS="$CPPFLAGS $LIBEVENT_CFLAGS" LDFLAGS="$LDFLAGS $LIBEVENT_LDFLAGS" LIBS="$LIBS $LIBEVENT_LIBS" AC_CHECK_LIB([event], [event_base_new], [], [AC_MSG_ERROR([libevent missing])] ) fi ```
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值