首页 > 其他分享 >epoll_create函数

epoll_create函数

时间:2024-01-30 18:34:47浏览次数:14  
标签:函数 epoll create create1 描述符 事件

目录


函数简介

/* Creates an epoll instance.  Returns an fd for the new instance.
   The "size" parameter is a hint specifying the number of file
   descriptors to be associated with the new instance.  The fd
   returned by epoll_create() should be closed with close().  */
extern int epoll_create (int __size) __THROW;

/* Same as epoll_create but with an FLAGS parameter.  The unused SIZE
   parameter has been dropped.  */
extern int epoll_create1 (int __flags) __THROW;

低层实现逻辑

epoll_create1 是 Linux 下的一个函数,用于创建一个 epoll 实例。它是 epoll 接口的一部分,用于高效地处理大量文件描述符的 I/O 事件。

epoll_create1 的底层实现逻辑主要涉及以下几个方面:

  1. 创建 epoll 实例:调用 epoll_create1 函数会在内核中创建一个 epoll 实例。这个实例用于存储要监听的文件描述符以及对应的事件。

  2. 分配内存:epoll 实例需要分配一定的内存来存储文件描述符和事件。内核会为每个 epoll 实例分配一块内存空间。

  3. 注册文件描述符:使用 epoll_ctl 函数可以将需要监听的文件描述符注册到 epoll 实例中,并指定感兴趣的事件。

  4. 等待事件:调用 epoll_wait 函数会阻塞当前线程,直到有事件发生。

  5. 事件处理:当有事件发生时,epoll_wait 函数会返回发生事件的文件描述符数量,并将对应的事件存储在用户提供的数组中。通过遍历这个数组,可以获取发生事件的文件描述符和对应的事件类型。

  6. 高效的实现:epoll 采用了一种基于回调的机制,不需要轮询所有的文件描述符来检测事件。它维护了一个红黑树来存储注册的文件描述符,并利用 mmap 来加速事件的通知和处理。

  7. 支持水平触发和边缘触发:epoll 可以配置为水平触发或边缘触发模式。水平触发模式下,只要文件描述符上有事件未处理,就会一直触发通知;而边缘触发模式下,只有在事件发生的边缘才会触发通知。

  8. 线程安全性:epoll 在多线程环境下是安全的,可以在多个线程中同时使用。

epoll_create1 的底层实现利用了 Linux 内核的 epoll 机制,提供了高效的 I/O 事件通知和处理能力。它是在 Linux 上进行高性能网络编程和并发编程的重要工具。


epoll_create与epoll_create1函数的区别

epoll_createepoll_create1的区别主要体现在它们的参数和功能上。

首先,epoll_create函数在早期版本的内核中用于创建一个新的epoll实例,它接受一个参数size,这个参数用来告诉内核这个epoll实例可以监听的最多文件描述符数目。然而,在较新的内核版本中,这个参数已经被弃用,因为内核可以根据需要动态地分配描述事件所需的内存空间。

相比之下,epoll_create1函数是在较新的内核版本中引入的,它的设计更加灵活和强大。epoll_create1的参数包括一个标志位flags,这个标志位可以用来设置一些额外的选项,比如EPOLL_CLOEXEC,这个选项可以在文件描述符上设置执行时关闭标志。如果flags参数为0,那么epoll_create1的行为就和没有flags参数的epoll_create一样。

另外,这两个函数在返回值方面也有所不同。epoll_create返回一个指向新创建的epoll实例的文件描述符,而epoll_create1在成功时返回一个非负的文件描述符,如果出现错误则返回-1,并设置相应的错误码。

总的来说,随着内核版本的更新和演进,epoll_create1提供了更多的选项和功能,使得用户可以更加灵活地使用epoll机制进行并发处理。

标签:函数,epoll,create,create1,描述符,事件
From: https://www.cnblogs.com/yubo-guan/p/17997722

相关文章

  • epoll_wait函数
    目录函数实现低层实现逻辑函数实现/*Waitforeventsonanepollinstance"epfd".Returnsthenumberoftriggeredeventsreturnedin"events"buffer.Or-1incaseoferrorwiththe"errno"variablesettothespecificerrorcode.The......
  • 达梦---自定义函数 find_in_set()
    createorreplaceFUNCTIONFIND_IN_SET(piv_str1varchar2,piv_str2varchar2,p_sepvarchar2:=',')RETURNNUMBERISl_idxnumber:=0;--用于计算piv_str2中分隔符的位置strvarchar2(500);--根据分隔符截取的子字符串piv_......
  • 【极简】conda同一个服务器上迁移环境 export / create
    导出直接看conda的document:https://docs.conda.io/projects/conda/en/latest/commands/env/export.htmlcondaenvexportcondaenvexport--fileSOME_FILE重建condadocumentation:https://docs.conda.io/projects/conda/en/latest/commands/env/create.htmlcondaenvc......
  • go启动流程(一) main函数的执行
    go版本:go1.19操作系统:linux系统架构:amd64go version go1.19 linux/amd64本文主要分析在go程序中,编写的main函数是如何被执行的。流程总览图启动流程从程序执行入口开始利用gdb确定程序执行入口编写一个简单的go程序//main.gopackage mainimport "fmt"func main......
  • 索引和函数视图及存储过程
    索引和函数视图及存储过程1.索引在数据库中索引最核心的作用是:加速查找1.1索引原理为什么加上索引之后速度能有这么大的提升呢?因为索引的底层是基于B+Tree的数据结构存储的很明显,如果有了索引结构的查询效率比表中逐行查询的速度要快很多且数据量越大越明显数据库的索......
  • node后端中sql使用的表达式和函数
    参考:https://xiaoman.blog.csdn.net/article/details/135903790一.表达式MySQL表达式是一种在MySQL数据库中使用的计算式或逻辑式。它们可用于查询、更新和过滤数据,以及进行条件判断和计算。算术表达式:可以执行基本的数学运算,例如加法、减法、乘法和除法。例如:SELECTcol1+co......
  • Python中的函数用法
    ​ Python中,函数是组织好的、可重用的、用来执行一个特定任务的代码块。函数提高了代码的模块化和代码重用率。函数是一种将代码块组织在一起以便重复使用的工具。函数可以接受输入数据,并返回输出数据。参考文档:Python中的函数用法-CJavaPy1、定义函数使用关键字def来定义......
  • 【18.0】MySQL进阶知识之函数
    【一】什么是函数跟存储过程是有区别的,存储过程是自定义函数,函数就类似于内置函数注意与存储过程的区别,mysql内置的函数只能在sql语句中使用!【二】字符串函数【0】介绍CONCAT(str1,str2,...):将多个字符串连接成一个字符串。SUBSTRING(str,start,length):返回字符......
  • R语言非线性方程数值分析生物降解、植物生长数据:多项式、渐近回归、负指数方程、幂函
    全文链接:https://tecdat.cn/?p=33742原文出处:拓端数据部落公众号简介在选择最佳拟合实验数据的方程时,可能需要一些经验。当我们没有文献信息时该怎么办?我们建立模型的方法通常是经验主义的。也就是说,我们观察过程,绘制数据并注意到它们遵循一定的模式。例如,我们的客户可能观察......
  • OpenHarmony—ArkTS不支持生成器函数
    规则:arkts-no-generators级别:错误目前ArkTS不支持生成器函数,使用async或await机制进行并行任务处理。TypeScriptfunction*counter(start:number,end:number){for(leti=start;i<=end;i++){yieldi;}}for(letnumofcounter(1,5)){console.l......