事件 linux linux软件仓库
大家好,关于事件 linux很多朋友都还不太明白,不过没关系,因为今天小编就来为大家分享关于linux软件仓库的知识点,相信应该可以解决大家的一些困惑和问题,如果碰巧可以解决您的问题,还望关注下本站哦,希望对各位有所帮助!
linux signal 11 是什么意思
信号是Linux编程中非常重要的部分,本文将详细介绍信号机制的基本概念、Linux对信号机制的大致实现方法、如何使用信号,以及有关信号的几个系统调用。信号机制是进程之间相互传递消息的一种方法,信号全称为软中断信号,也有人称作软中断。从它的命名可以看出,它的实质和使用很象中断。所以,信号可以说是进程控制的一部分。一、信号的基本概念本节先介绍信号的一些基本概念,然后给出一些基本的信号类型和信号对应的事件。基本概念对于理解和使用信号,对于理解信号机制都特别重要。下面就来看看什么是信号。 1、基本概念软中断信号(signal,又简称为信号)用来通知进程发生了异步事件。进程之间可以互相通过系统调用kill发送软中断信号。内核也可以因为内部事件而给进程发送信号,通知进程发生了某个事件。注意,信号只是用来通知某进程发生了什么事件,并不给该进程传递任何数据。收到信号的进程对各种信号有不同的处理方法。处理方法可以分为三类:第一种是类似中断的处理程序,对于需要处理的信号,进程可以指定处理函数,由该函数来处理。第二种方法是,忽略某个信号,对该信号不做任何处理,就象未发生过一样。第三种方法是,对该信号的处理保留系统的默认值,这种缺省操作,对大部分的信号的缺省操作是使得进程终止。进程通过系统调用signal来指定进程对某个信号的处理行为。在进程表的表项中有一个软中断信号域,该域中每一位对应一个信号,当有信号发送给进程时,对应位置位。由此可以看出,进程对不同的信号可以同时保留,但对于同一个信号,进程并不知道在处理之前来过多少个。 2、信号的类型发出信号的原因很多,这里按发出信号的原因简单分类,以了解各种信号:(1)与进程终止相关的信号。当进程退出,或者子进程终止时,发出这类信号。(2)与进程例外事件相关的信号。如进程越界,或企图写一个只读的内存区域(如程序正文区),或执行一个特权指令及其他各种硬件错误。(3)与在系统调用期间遇到不可恢复条件相关的信号。如执行系统调用exec时,原有资源已经释放,而目前系统资源又已经耗尽。(4)与执行系统调用时遇到非预测错误条件相关的信号。如执行一个并不存在的系统调用。(5)在用户态下的进程发出的信号。如进程调用系统调用kill向其他进程发送信号。(6)与终端交互相关的信号。如用户关闭一个终端,或按下break键等情况。(7)跟踪进程执行的信号。 Linux支持的信号列表如下。很多信号是与机器的体系结构相关的,首先列出的是POSIX_sec= 1; value_usec= 0; value_sec= 1; value_usec= 0; setitimer(ITIMER_REAL,&value,&ovalue); value2_sec= 0; value2_usec= 500000; value2_sec= 0; value2_usec= 500000; setitimer(ITIMER_VIRTUAL,&value2,&ovalue); for(;;);}该例子的屏幕拷贝如下: localhost:~$./timer_test process id is 579 Catch a signal– SIGVTALRM Catch a signal– SIGALRM Catch a signal– SIGVTALRM Catch a signal– SIGVTALRM Catch a signal– SIGALRM Catch a signal–GVTALRM
如何在linux下实现event事件机制
一、Libevent简介
libevent是一个基于事件触发的网络库,适用于windows、linux、bsd等多种平台,内部使用select、epoll、kqueue等系统调用管理事件机制。
特点:
事件驱动,高性能;
轻量级,专注于网络,不如ACE那么臃肿庞大,只提供了简单的网络API的封装,线程池,内存池,递归锁等均需要自己实现;
开放源码,代码相当精炼、易读;
跨平台,支持Windows、Linux、BSD和Mac OS;
支持多种I/O多路复用技术(epoll、poll、dev/poll、select和kqueue等),在不同的操作系统下,做了多路复用模型的抽象,可以选择使用不同的模型,通过事件函数提供服务;
支持I/O,定时器和信号等事件;
采用Reactor模式;
二、源码组织结构
Libevent的源代码虽然都在一层文件夹下面,但是其代码分类还是相当清晰的,主要可分为头文件、内部使用的头文件、辅助功能函数、日志、libevent框架、对系统I/O多路复用机制的封装、信号管理、定时事件管理、缓冲区管理、基本数据结构和基于libevent的两个实用库等几个部分,有些部分可能就是一个源文件。
1)头文件
主要就是event.h:事件宏定义、接口函数声明,主要结构体event的声明;
2)内部头文件
xxx-internal.h:内部数据结构和函数,对外不可见,以达到信息隐藏的目的;
3)libevent框架
event.c:event整体框架的代码实现;
4)对系统I/O多路复用机制的封装
epoll.c:对epoll的封装;
select.c:对select的封装;
devpoll.c:对dev/poll的封装;
kqueue.c:对kqueue的封装;
5)定时事件管理
min-heap.h:其实就是一个以时间作为key的小根堆结构;
6)信号管理
signal.c:对信号事件的处理;
7)辅助功能函数
evutil.h和evutil.c:一些辅助功能函数,包括创建socket pair和一些时间操作函数:加、减和比较等。
8)日志
log.h和log.c:log日志函数
9)缓冲区管理
evbuffer.c和buffer.c:libevent对缓冲区的封装;
10)基本数据结构
compat/sys下的两个源文件:queue.h是libevent基本数据结构的实现,包括链表,双向链表,队列等;_libevent_time.h:一些用于时间操作的结构体定义、函数和宏定义;
11)实用网络库
http和evdns:是基于libevent实现的http服务器和异步dns查询库;
让事件飞 ——Linux eventfd 原理与实践
在当今的程序设计中,事件驱动的方式变得越来越普遍。为了有效地利用系统资源并实现通知的管理和送达,Linux系统中提供了事件通知的机制,如 eventfd和 timerfd。这两个机制,前者用于触发事件通知,后者则用于定时器事件通知。
使用 eventfd时,开发者只需包含相应的头文件即可。创建一个 eventfd对象,类似于普通文件的 open操作,该对象内部维护一个无符号的 64位计数器,初始化值为用户指定。事件通知可通过两种操作实现:read操作将计数器值置零,而 write操作用于设置计数器值。同时,该对象支持 epoll/poll/select操作,以及关闭操作。
对于 timerfd,开发者需调用 timerfd_create函数创建新的 timerfd对象,指定时钟类型,通常选择实时时钟(CLOCK_REALTIME)或单调递增时钟(CLOCK_MONOTONIC)。timerfd_settime函数用于设置定时器的过期时间,其中包含首次过期时间及周期性触发的间隔时间。timerfd_gettime函数用于获取当前设置值,而 read操作返回已过期的次数或阻塞至过期,取决于是否设置了 NONBLOCK标志。
使用实例展示了如何实现高性能的消费者线程池,通过生产者-消费者设计模式,将 eventfd和 timerfd用于事件通知。消费者线程池中的线程共用一个 epoll对象,通过 epoll_wait以轮询方式处理针对 eventfd或 timerfd触发的事件。在 eventfd实现中,推荐在打开时设置 NON_BLOCKING,并在 epoll监听对象上设置 EPOLLET,以发挥非阻塞 IO和边沿触发的最大并发能力。
在 timerfd实现中,main函数和消费者线程与 eventfd类似,而生产者线程则创建 timerfd并将其注册到事件循环中。timer的 it_value设为 1秒,it_interval设为 3秒,用于设置定时器事件。执行过程与 eventfd类似,通过 epoll监控 timerfd触发的事件。
事件通知场景中,使用 eventfd/timerfd相较于 pipe有显著的优势,主要体现在资源管理和性能方面。在信号通知场景下,eventfd/timerfd与 pipe相比,提供了更高效的资源利用和性能。因此,当 pipe仅用于发送通知而非数据传输时,应优先选择 eventfd/timerfd。
eventfd/timerfd与 epoll结合使用时,可实现非阻塞的读取等特性,进一步提升性能。同时,这两个机制的设计使得它们与 epoll的集成更加紧密,能够支持在监控其他文件描述符状态的同时,同时监控内核通知机制。这为应用程序提供了更高效和灵活的事件处理方式。
在内核源码中,eventfd的实现作为系统调用在 fs/eventfd.c下实现在 2.6.22版本中引入,并在 2.6.27版本后增加了对 flag的支持。其核心数据结构是 eventfd_ctx,包含一个 64位计数器和其他相关组件。read函数通过加锁实现对计数器的独占访问,并在阻塞或非阻塞模式下返回相应的结果。write函数则同步更新计数器值并唤醒等待队列中的线程。poll操作则用于监控 eventfd的可读事件状态。
总结而言,eventfd/timerfd提供了高效和简单的事件通知机制,内核源码中实现了这些机制的精巧高效性。这些机制不仅功能实用,而且调用方式简单,为用户态应用程序封装了高效的事件通知机制,同时也与 epoll等系统功能高度集成,提供了丰富的事件处理方式。
参考资料:
- Linux内核源码:elixir.bootlin.com/linu...
- Linux Programmer's Manual:eventfd(2)- Linux manual page