首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

Linux】详解用户态和内核态&&内核中信号处理时机&&sigaction信号自定义处理方法

内核态下代码具有最高级别的权限,可以访问硬件、执行敏感操作,并管理系统资源。 1.3、用户态和内核态切换时机 当用户态下进程需要执行特权操作时,它会通过系统调用接口向内核发出请求。...在这三种情况下,操作系统都会保存用户态上下文,并在内核态下处理这些事件。 二、信号处理时机  如下图所示,进程从内核态切换回用户态时候,信号会被检测并处理。...在内核中,所有的系统调用函数其实是用一个函数指针数组所管理起来,该函数指针数组会通过页表映射与1G内核空间某些虚拟地址建立起映射关系,这样当正文代码部分要调用某个系统调用函数时,只需要拿着虚拟地址在内核空间中寻找再通过页表映射就可以在内存中找到该系统调用函数...既然操作系统已经映射到我们进程地址空间上,那是否意味着我们可以随便访问操作系统中内容了呢?答案肯定不是的。...pending位图中没有2号信号,再次发送2号信号发现pending位图中有2号信号,证明2号信号屏蔽了,因为进程在处理某个信号时如果再次给它发送同一个信号信号会被自动屏蔽,依次再向进程发送3,4,5

13100

LinuxInitcall机制之初始化函数调用时机

什么是Linuxinitcall Linuxinitcall是一种初始化调用机制,它在Linux内核启动过程中用于执行一系列初始化任务。...initcall机制向Linux内核注册了多组回调函数,这些函数在系统初始化时按照预定顺序调用。initcall主要目的是对设备、内核子系统等进行初始化,以确保系统能够正常运行。...内核提供了相应宏来注册不同等级initcall函数,这些宏位于include/linux/init.h文件中。...定义地方在 include/linux/init.h /* * Early initcalls run before initializing SMP....在Linux 6.1.9中,initcall是这样调用: start_kernel()->arch_call_rest_init()->rest_init()---创建新内核线程执行-->kernel_init

28410
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    Linux信号】一:信号概念、信号产生

    这些信号都有一些共同点:一是简单;而是不能携带大量信息;三是满足某个特设条件才发送。 信号是信息载体,是Linux/UNIX 环境下,古老而经典通信方式, 现在依然是主要通信手段。...3.4 PCB中信号相关信息 Linux内核进程控制块PCB是一个结构体task_struct,除了包含进程id、状态、工作目录、用户id、组id、文件描述符表、还包含了信号相关信息,主要指阻塞信号集和未决信号集...未决信号集: 信号产生,未决信号集中描述该信号位立刻翻转为1,表信号处于未决状态;当信号处理对应位翻转回为0,这一时刻往往非常短暂。...未决信号集就是没有处理信号,未决信号集实际上是一个32位数,每一位代表一个信号,当信号产生时候,就把对应位反转为1,如果该信号未被处理就反转回0,处理了就保持为1。...因此有些信号出现在Unix系统内,也出现在Linux中,而有的信号出现在FreeBSD或 Mac OS 中却没有出现在Linux下。这里我们只研究Linux系统中信号

    8510

    Linux信号】三:信号捕捉

    注册一个信号捕捉函数,该函数由ANSI定义,由于历史原因在不同版本Unix和不同版本Linux中可能有不同行为。因此应该尽量避免使用它,取而代之使用sigaction函数。...sa_mask 调用信号处理函数时,所要屏蔽信号集合(信号屏蔽字)。注意:仅在处理函数调用期间屏蔽生效,是临时性设置。实际上就是执行捕捉函数期间临时屏蔽信号集。...某个信号sig捕捉函数执行期间,sig信号自动屏蔽。 阻塞常规信号不支持排队,如果产生多次,只记录一次。...实际上是这样,未决信号集中使用某一位0和1来记录信号是否处理,所以不管这个信号被发送了几次,未决信号集对应位也只能有一个1,后续也只能处理一次,它不会记录信号屏蔽期间总共发送了几次该信号,解除屏蔽后只会处理一次...执行完信号处理函数后通过系统调用sigreturn再次陷入内核,然后返回用户态从中断地方继续执行主控制逻辑。

    13410

    初谈Linux信号-=-信号产生

    忽略快 递(快递拿上来之后,扔掉床头,继续开一把游戏) 快递到来整个过程,对你来讲是异步,你不能准确断定快递员什么时候给你打电话 Linux信号Linux操作系统中通过kill -l命令可查看所有的信号...: 信号是从1号开始,从信号1到信号31是普通信号,从信号35到信号64称之为实时信号,一般不考虑实时信号。...信号Linux系统提供一种向指定进程发送特定事件一种方式,系统在收到信号时会做识别和处理。...信号产生是异步信号产生和目标进程运行是两条线,信号可以在程序任意时刻产生,并且会打断当前正在执行代码,转而执行信号处理函数。...异常产生信号 硬件异常被硬件以某种方式硬件检测到并通知内核,然后内核向当前进程发送适当信号

    7410

    Linux信号处理

    在CPU中,键盘按下时会向cpu发送硬件中断,CPU就会读取中断号读到寄存器中,CPU会告诉OS,后续通过软件来读取寄存器。...每个硬件都有自己中断号,键盘也是。按下键盘时,向CPU发送中断信号,然后调用键盘读取方法,将键盘数据读取到内存中!这样就不需要轮询检查键盘是否输入了!...来看Linux内核: 在操作系统主函数中,首先是进行一些初始化(包括系统调用方法),然后就进入到了死循环!...当然如果把所有信号都屏蔽了,肯定是不行,所以有一部分信号不能屏蔽,比如9号信号永远都不能屏蔽!!!...volatile关键字 我们今天在信号角度再来重温一下: volatile 作用:保持内存可见性,告知编译器,该关键字修饰变量,不允许优化,对该变量任何操作,都必须在真实内存中进行操作保持数据可见性

    8810

    Linux信号保存

    是对应6号信号(终止会打印Aborted!)其特殊性质是可以被捕捉,但是进程还是会被终止掉,就是为了防止发生所有信号都被捕捉,没有信号可以终止情况,9号信号和19号信号不能自定义捕捉!!!...再次注意: 阻塞信号产生时将保持在未决状态,直到进程解除对此信号阻塞,才执行递达动作....对信号操作 我们认识了内核数据结构中三张表,那么如果对它们进行操作呢?Linux操作系统为我们提供了用户级别的位图!...sigset_t是Linux操作系统提供一个用户级数据类型,禁止用户直接修改位图!!!...: 系统调用sigprocmask可以读取或更改进程信号屏蔽字(阻塞信号集block表) #include /* Prototype for the glibc wrapper

    8410

    Linux笔记(15)| Linux信号

    今天要分享Linux信号机制,信号是一种软件中断,是一种处理异步事件方法,可以很好地在多个进程之间进行同步和简单数据交换。...二、信号注册和响应 前面讲了三种发送信号方式,但是光发送信号还不够,对于接收方来说,还得对信号进行处理。 一般可以使用signal函数和sigaction函数来注册信号。...signal函数第一个参数是信号类型,第二个参数是函数指针,也就是跳转到哪里去执行。也就是说,当收到第一个参数表示信号之后,就会跳转到第二个参数指向代码段去执行。...成员sa_sigaction 则是另一个信号处理函数,它有三个参数,可以获得关于信号更详细信息。...接下来写一个简单代码,来应用一下上面的几个函数。实现需求就是创建一个子进程,父进程每隔一秒钟向子进程发送一个信号,子进程收到信号之后往一个txt文档中写入一句话。

    2.6K10

    Linux】 进程信号发生

    1 何为信号 生活中信号随处可见,我们生活离不开信号。...我们可以看看在Linux系统下信号信号时从 1 - 64 数字对应信号(32 - 64 是实时信号,暂不考虑) 信号生命周期可以划分为:预备 -> 产生 -> 保存 -> 处理 。...我们把这个过程研究明白就可以了 2 信号概念基础储备 信号Linux系统通过一种向目标进程发送指定事件方式。要做识别和处理。...信号产生时异步:对于一个进程不知道什么时候会收到信号,他只能先做自己事情,信号产生时也不知道进程在干什么,所以是异步!!!...是对应6号信号(终止会打印Aborted!)其特殊性质是可以被捕捉,但是进程还是会被终止掉,就是为了防止发生所有信号都被捕捉,没有信号可以终止情况,9号信号和19号信号不能自定义捕捉!!!

    9710

    Linux】详解信号保存&&信号屏蔽字设置

    阻塞信号产生时将保持在未决状态,直到进程解除对此信号阻塞,才执行递达动作。 注意:阻塞和忽略是不同,只要信号阻塞就不会递达,而忽略是在递达之后可选一种处理动作。...在上图中,三个数组(前两张位图也可以看成数组)应该横着看,依次表示该信号是否阻塞,是否收到该信号,以及执行该信号处理方法。...常规信号在递达之前产生多次只计一次,也就是说,当在一段时间内有多个相同信号到来但却来不及处理时,在pending位图里只会记录一次。而实时信号在递达之前产生多次可以依次放在一个队列里。...我们设置完信号集set值后,set并没有设置进进程PCB中,还需要我们调用系统调用函数设置。...,程序到20秒时退出: 四、总结 31个信号中并不是所有信号都可以屏蔽掉,9号信号(SIGKILL)和19号信号(SIGSTOP)是无法屏蔽掉

    9410

    LinuxSIGCHLD信号

    那么这两个操作对于父进程来说都不是理想,因此可以通过SIGCHLD信号来实现异步操作。...也就是当子进程结束时候通过SIGCHLD信号告诉父进程,然后父进程再去释放其资源,如果没有收到该信号也不影响父进程运行。        ...子进程处在停止态,接受到SIGCONT后唤醒时        下面我们通过示例来进一步详细说明,我们实现一个父进程来创建10个子进程,然后通过捕捉信号来实现上述所说功能。...首先我们需要考虑,当我们创建子进程时候,如果父进程还没有定义捕捉函数子进程就结束了,那么这个子进程就变为了僵尸进程,所以在定义捕捉函数之前需要先将SIGCHLD信号进行阻塞,在定义捕捉函数后再去UNBLOCK...,就可以捕捉到子进程信号了。

    4.5K10

    Linux】进程信号 --- 信号产生 保存 捕捉递达

    因为进程在CPU上运行时候,进程相关上下文数据都被临时加载到CPU寄存器上了,操作系统一读取寄存器内容,进程相关数据还不是轻轻松松都拿到了吗?...CPU寄存器读取到进程内核资源,进程如果想要执行内核代码,CPU也可以通过进程内部内核空间找到对应内核代码并执行。...sigprocmask是一个可以读取或修改进程信号屏蔽字函数,set和oset均为输出型参数,函数内部会对set和oldset指针指向sigset_t类型变量做修改。...如果oset为非空指针,则读取当前进程信号屏蔽字通过oset指针变量传出。...注意:此方法对于Linux系统可用,但不保证在其他UNIX系统上也可用,比如MAC OS 或 直接本身就是UNIX操作系统。

    1.6K10

    Linux信号保存和处理

    没有关系, 阻塞信号产生时将保持在未决状态,直到进程解除对此信号阻塞,才执行递达动作....POSIX.1允许系统递送该信号一次或多次。Linux是这样实现:常规信号在递达之前产生多次只计一次,而实时信号在递达之前产生多次可以依次放在一个队列里。...注意: 解除屏蔽一般会立即处理当前解除信号 在递达之前,pending位图对应信号清0 信号处理 处理信号就是递达信号,在上面我们处理信号使用是signal函数: signal(2,handler...CPU将寄存器里值在函数指针数组中索引,CPU会执行读取键盘方法,读取到内存指定区。 另外这个函数指针数组在硬件层面上叫做中断向量表。...显然,这也是一个回调函数,不是main函数调用,而是系统所调用。 实例: 当前如果正在对2号信号进行处理,默认2号信号会被自动屏蔽,对2号信号处理完成时候,会自动解除对2号信号屏蔽。

    7310

    Linux】详解信号产生方式

    SIGQUIT(3号信号): 终止进程并产生core文件,用于后续分析程序崩溃时状态和数据。 SIGKILL(9号信号):强制终止信号,不能进程捕获或阻塞,用于强制结束进程。...SIGSTOP(20号信号):停止信号,使进程停止执行,直到收到SIGCONT信号。 SIGCONT(18号信号):继续信号,使之前SIGSTOP信号停止进程继续执行。...二、键盘产生信号 不同操作系统产生信号键盘组合键可能不同,这里说是ubuntu系统下。常见键盘产生信号有: ctrl + c:向当前进程发送2号信号。...abort系统调用函数就是一个用来给进程自己发送6号信号系统调用函数。 四、软件条件产生信号 在操作系统中,由软件条件产生信号通常指的是通过某种软件操作或系统状态触发信号。...下面会说明常见软件条件: 4.1、管道通信 【Linux】匿名管道实现简单进程池-CSDN博客之前在这一篇博客中,我已经介绍了进程间使用管道通信四种情况和五种特性,其中在第四种情况中,我曾经说过,读端关闭了

    12510

    Linux】详解信号分类&&如何自定义信号作用

    一、信号定义         Linux系统提供让用户(进程)给其他进程发送异步信息一种方式。在操作系统中,信号是一种进程间通讯有限制方式,主要用于提醒进程某个事件已经发生。...操作系统要可以对信号进行如下两个操作: 操作系统能够识别一个信号并对该信号进行处理。 因为信号是异步产生,所以操作系统要能够对到来信号进行临时保存。...二、信号分类 kill -l//查看系统中所存在信号 我们可以看到每一个信号对应一个信号和一个宏名称,以后我们给进程发送信号既可以采用发送数字形式也可以采用发送宏名称方式。 ...三、自定义信号处理方式         如果我们不对收到信号做自定义处理方式,那该信号就会按默认方式进行处理。...自定义信号处理方式在我理解中有两种,一种是让收到该信号进程处理我交给它任务,另外一种是忽略该收到信号,下面我会对这两种方式进行简单演示。

    27510

    linux | kill命令详解以及linux信号

    简介# kill命令很容易让人产生误解, 以为仅仅是用来终止linux进程....支持信号# [root@lvbibir ~]# kill -l 1) SIGHUP 2) SIGINT 3) SIGQUIT 4) SIGILL 5)..., 在这些信号中只有9) SIGKILL可以无条件地终止process, 其他信号都将依照process中定义信号处理规则来进行忽略或者处理....上述信号中常用其实很少, 如下表所示 编号 名称 解释 1 SIGHUP 启动终止程序, 也可以让进程重新读取自己配置文件, 类似重新启动 2 SIGINT 相当于输入 ctrl-c 来中断一个程序...常用命令# 以正常方式终止进程, 由于信号15是最常用也是最佳程序退出方式, 所以 kill 命令不指定信号时, 默认使用就是信号 15 kill pid # 或者 kill -15 pid 强制终止进程

    2.6K60

    Linux:进程信号(一.认识信号信号产生及深层理解、Term与Core)

    当进程正在执行某些重要任务时,如果接收到信号,可能无法立即处理,此时系统会将信号暂时保存,等到合适时机再进行处理。...信号到了,可以不立即处理,选择在合适时候处理:进程可以选择在合适时机处理信号,而不是立即响应。这种灵活性使得进程能够根据自身状态和需求来处理信号。...信号产生是随时产生,我们无法准确预料,所以信号是异步发送信号是由其他用户、进程或系统事件产生,进程无法准确预测信号产生时机。...一般来说,abort()函数用于发现程序中严重错误,并且需要立即终止程序执行。...进程在接收到这样信号后,会立即停止运行,并释放其所占用系统资源。 除非进程已经捕获了该信号并定义了自己信号处理函数,否则进程会按照默认Term动作终止。

    16410

    Linuxsignal信号机制

    Linux中,要发送一个信号相当容易。程序员需要知道两个信息:要发送哪个信号,将这个信号发送给哪个进程。可以用 man 7 signal 找到一个可以利用信号列表。...缺省情况下该Signal会被忽略 SIGCONT 当stop进程恢复运行时候,自动发送 SIGEMT 和实现相关硬件异常 SIGFPE 数学相关异常,如被0除,浮点溢出,等等 SIGFREEZE...发送给所有Foreground Group进程 SIGTTIN 当Background Group进程尝试读取Terminal时候发送 SIGTTOU 当Background Group进程尝试写...(Linux中国) http://www.linux-cn.com/html/linux/system/20070505/27605.shtml Linux 信号signal处理函数(CSDN) http...当用户调用alarm()时,前面任何一个请求报警信号(不包括悬挂起来阻塞SIGALRM信号)都将被取消,调用返回值是前面请求剩余时间。

    3.9K20

    linux系统编程之信号(三):信号阻塞与未决

    进程可以选择阻塞(Block)某个信号,SIGKILL 和 SIGSTOP 不能阻塞。阻塞信号产生时将保持在未决状态,直到进程解除对此信号阻塞,才执行递达动作。...注意,阻塞和忽略是不同,只要信号阻塞就不会递达,而忽略是在递达之后可选一种处理动作。信号在内核中表示可以看作是这样: ?...未决和阻塞标志可以用相同数据类型sigset_t来存储,sigset_t称为信号集,这个类型可以表示每个信号“有效”或“无效”状态,,在阻塞信号集中“有效”和“无效”含义是该信号是否阻塞,而在未决信号集中...三、sigprocmask 和 sigpending 函数 1、调用函数sigprocmask可以读取或更改进程信号屏蔽字。...假设当前信号屏蔽字为mask,下表说明了how参数可选值。 ? 2、sigpending读取当前进程未决信号集,通过set参数传出。调用成功则返回0,出错则返回-1。

    2.2K00
    领券