内核态下的代码具有最高级别的权限,可以访问硬件、执行敏感操作,并管理系统资源。 1.3、用户态和内核态的切换时机 当用户态下的进程需要执行特权操作时,它会通过系统调用接口向内核发出请求。...在这三种情况下,操作系统都会保存用户态的上下文,并在内核态下处理这些事件。 二、信号被处理的时机 如下图所示,进程从内核态切换回用户态的时候,信号会被检测并处理。...在内核中,所有的系统调用函数其实是被用一个函数指针数组所管理起来的,该函数指针数组会通过页表的映射与1G的内核空间的某些虚拟地址建立起映射关系,这样当正文代码部分要调用某个系统调用函数时,只需要拿着虚拟地址在内核空间中寻找再通过页表的映射就可以在内存中找到该系统调用函数...既然操作系统已经被映射到我们进程的地址空间上,那是否意味着我们可以随便访问操作系统中的内容了呢?答案肯定不是的。...pending位图中没有2号信号,再次发送2号信号发现pending位图中有2号信号,证明2号信号被屏蔽了,因为进程在处理某个信号时如果再次给它发送同一个信号该信号会被自动屏蔽,依次再向进程发送3,4,5
什么是Linux的initcall Linux的initcall是一种初始化调用的机制,它在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
注册一个信号捕捉函数,该函数由ANSI定义,由于历史原因在不同版本的Unix和不同版本的Linux中可能有不同的行为。因此应该尽量避免使用它,取而代之使用sigaction函数。...sa_mask 调用信号处理函数时,所要屏蔽的信号集合(信号屏蔽字)。注意:仅在处理函数被调用期间屏蔽生效,是临时性设置。实际上就是执行捕捉函数期间临时屏蔽的信号集。...某个信号sig捕捉函数执行期间,sig信号自动被屏蔽。 阻塞的常规信号不支持排队,如果产生多次,只记录一次。...实际上是这样的,未决信号集中使用某一位的0和1来记录信号是否被处理的,所以不管这个信号被发送了几次,未决信号集对应位也只能有一个1,后续也只能处理一次,它不会记录信号屏蔽期间总共发送了几次该信号,解除屏蔽后只会处理一次...执行完信号处理函数后通过系统调用sigreturn再次陷入内核,然后返回用户态从被中断的地方继续执行主控制逻辑。
这些信号都有一些共同点:一是简单;而是不能携带大量信息;三是满足某个特设条件才发送。 信号是信息的载体,是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系统中的信号。
忽略快 递(快递拿上来之后,扔掉床头,继续开一把游戏) 快递到来的整个过程,对你来讲是异步的,你不能准确断定快递员什么时候给你打电话 Linux中信号 在Linux操作系统中通过kill -l命令可查看所有的信号...: 信号是从1号开始的的,从信号1到信号31是普通信号,从信号35到信号64称之为实时信号,一般不考虑实时信号。...信号是Linux系统提供的一种向指定进程发送特定事件的一种方式,系统在收到信号时会做识别和处理。...信号产生是异步的:信号的产生和目标进程的运行是两条线,信号可以在程序的任意时刻产生,并且会打断当前正在执行的代码,转而执行信号处理函数。...异常产生信号 硬件异常被硬件以某种方式被硬件检测到并通知内核,然后内核向当前进程发送适当的信号。
是对应的6号信号(终止会打印Aborted!)其特殊的性质是可以被捕捉,但是进程还是会被终止掉,就是为了防止发生所有信号都被捕捉,没有信号可以终止的情况,9号信号和19号信号不能被自定义捕捉!!!...再次注意: 被阻塞的信号产生时将保持在未决状态,直到进程解除对此信号的阻塞,才执行递达的动作....对信号集的操作 我们认识了内核数据结构中的三张表,那么如果对它们进行操作呢?Linux操作系统为我们提供了用户级别的位图!...sigset_t是Linux操作系统提供的一个用户级数据类型,禁止用户直接修改位图!!!...: 系统调用sigprocmask可以读取或更改进程的信号屏蔽字(阻塞信号集block表) #include /* Prototype for the glibc wrapper
在CPU中,键盘按下时会向cpu发送硬件中断,CPU就会读取中断号读到寄存器中,CPU会告诉OS,后续通过软件来读取寄存器。...每个硬件都有自己的中断号,键盘也是。按下键盘时,向CPU发送中断信号,然后调用键盘读取方法,将键盘数据读取到内存中!这样就不需要轮询检查键盘是否输入了!...来看Linux内核: 在操作系统的主函数中,首先是进行一些初始化(包括系统调用方法),然后就进入到了死循环!...当然如果把所有信号都屏蔽了,肯定是不行的,所以有一部分信号不能被屏蔽,比如9号信号永远都不能屏蔽!!!...volatile关键字 我们今天在信号的角度再来重温一下: volatile 作用:保持内存的可见性,告知编译器,被该关键字修饰的变量,不允许被优化,对该变量的任何操作,都必须在真实的内存中进行操作保持数据可见性
今天要分享的是Linux中的信号机制,信号是一种软件中断,是一种处理异步事件的方法,可以很好地在多个进程之间进行同步和简单的数据交换。...二、信号的注册和响应 前面讲了三种发送信号的方式,但是光发送信号还不够,对于接收方来说,还得对信号进行处理。 一般可以使用signal函数和sigaction函数来注册信号。...signal函数的第一个参数是信号类型,第二个参数是函数指针,也就是跳转到哪里去执行。也就是说,当收到第一个参数表示的信号之后,就会跳转到第二个参数指向的代码段去执行。...成员sa_sigaction 则是另一个信号处理函数,它有三个参数,可以获得关于信号的更详细的信息。...接下来写一个简单的代码,来应用一下上面的几个函数。实现的需求就是创建一个子进程,父进程每隔一秒钟向子进程发送一个信号,子进程收到信号之后往一个txt文档中写入一句话。
1 何为信号 生活中信号随处可见,我们的生活离不开信号。...我们可以看看在Linux系统下的信号: 信号时从 1 - 64 的数字对应信号(32 - 64 是实时信号,暂不考虑) 信号的生命周期可以划分为:预备 -> 产生 -> 保存 -> 处理 。...我们把这个过程研究明白就可以了 2 信号概念的基础储备 信号是Linux系统通过的一种向目标进程发送指定事件的方式。要做识别和处理。...信号产生时异步的:对于一个进程不知道什么时候会收到信号,他只能先做自己的事情,信号产生时也不知道进程在干什么,所以是异步的!!!...是对应的6号信号(终止会打印Aborted!)其特殊的性质是可以被捕捉,但是进程还是会被终止掉,就是为了防止发生所有信号都被捕捉,没有信号可以终止的情况,9号信号和19号信号不能被自定义捕捉!!!
被阻塞的信号产生时将保持在未决状态,直到进程解除对此信号的阻塞,才执行递达的动作。 注意:阻塞和忽略是不同的,只要信号被阻塞就不会递达,而忽略是在递达之后可选的一种处理动作。...在上图中,三个数组(前两张位图也可以看成数组)应该横着看,依次表示该信号是否被阻塞,是否收到该信号,以及执行该信号的处理方法。...常规信号在递达之前产生多次只计一次,也就是说,当在一段时间内有多个相同的信号到来但却来不及被处理时,在pending位图里只会记录一次。而实时信号在递达之前产生多次可以依次放在一个队列里。...我们设置完信号集set的值后,set并没有被设置进进程的PCB中,还需要我们调用系统调用函数设置。...,程序到20秒时退出: 四、总结 31个信号中并不是所有信号都可以被屏蔽掉,9号信号(SIGKILL)和19号信号(SIGSTOP)是无法被屏蔽掉的。
那么这两个操作对于父进程来说都不是理想的,因此可以通过SIGCHLD信号来实现异步的操作。...也就是当子进程结束的时候通过SIGCHLD信号告诉父进程,然后父进程再去释放其资源,如果没有收到该信号也不影响父进程的运行。 ...子进程处在停止态,接受到SIGCONT后唤醒时 下面我们通过示例来进一步详细说明,我们实现一个父进程来创建10个子进程,然后通过捕捉信号来实现上述所说的功能。...首先我们需要考虑,当我们创建子进程的时候,如果父进程还没有定义捕捉函数子进程就结束了,那么这个子进程就变为了僵尸进程,所以在定义捕捉函数之前需要先将SIGCHLD信号进行阻塞,在定义捕捉函数后再去UNBLOCK...,就可以捕捉到子进程的信号了。
因为进程在CPU上运行的时候,进程相关的上下文数据都被临时加载到CPU的寄存器上了,操作系统一读取寄存器内容,进程的相关数据还不是轻轻松松都拿到了吗?...CPU的寄存器读取到进程的内核资源,进程如果想要执行内核代码,CPU也可以通过进程内部的内核空间找到对应的内核代码并执行。...sigprocmask是一个可以读取或修改进程信号屏蔽字的函数,set和oset均为输出型参数,函数内部会对set和oldset指针指向的sigset_t类型变量做修改。...如果oset为非空指针,则读取当前进程的信号屏蔽字通过oset指针变量传出。...注意:此方法对于Linux系统可用,但不保证在其他UNIX系统上也可用,比如MAC OS 或 直接本身就是UNIX操作系统。
没有关系, 被阻塞的信号产生时将保持在未决状态,直到进程解除对此信号的阻塞,才执行递达的动作....POSIX.1允许系统递送该信号一次或多次。Linux是这样实现的:常规信号在递达之前产生多次只计一次,而实时信号在递达之前产生多次可以依次放在一个队列里。...注意: 解除屏蔽一般会立即处理当前被解除的信号 在递达之前,pending位图对应的信号被清0 信号的处理 处理信号就是递达信号,在上面我们处理信号使用的是signal函数: signal(2,handler...CPU将寄存器里的值在函数指针数组中索引,CPU会执行读取键盘方法,读取到内存的指定区。 另外这个函数指针数组在硬件层面上叫做中断向量表。...显然,这也是一个回调函数,不是被main函数调用,而是被系统所调用。 实例: 当前如果正在对2号信号进行处理,默认2号信号会被自动屏蔽,对2号信号处理完成的时候,会自动解除对2号信号的屏蔽。
SIGQUIT(3号信号): 终止进程并产生core文件,用于后续分析程序崩溃时的状态和数据。 SIGKILL(9号信号):强制终止信号,不能被进程捕获或阻塞,用于强制结束进程。...SIGSTOP(20号信号):停止信号,使进程停止执行,直到收到SIGCONT信号。 SIGCONT(18号信号):继续信号,使之前被SIGSTOP信号停止的进程继续执行。...二、键盘产生信号 不同的操作系统产生信号的键盘组合键可能不同,这里说的是ubuntu系统下。常见的键盘产生的信号有: ctrl + c:向当前进程发送2号信号。...abort系统调用函数就是一个用来给进程自己发送6号信号的系统调用函数。 四、软件条件产生信号 在操作系统中,由软件条件产生的信号通常指的是通过某种软件操作或系统状态触发的信号。...下面会说明常见的软件条件: 4.1、管道通信 【Linux】匿名管道实现简单进程池-CSDN博客之前在这一篇博客中,我已经介绍了进程间使用管道通信的四种情况和五种特性,其中在第四种情况中,我曾经说过,读端关闭了
一、信号的定义 Linux系统提供的让用户(进程)给其他进程发送异步信息的一种方式。在操作系统中,信号是一种进程间通讯的有限制的方式,主要用于提醒进程某个事件已经发生。...操作系统要可以对信号进行如下的两个操作: 操作系统能够识别一个信号并对该信号进行处理。 因为信号是异步产生的,所以操作系统要能够对到来的信号进行临时保存。...二、信号的分类 kill -l//查看系统中所存在的信号 我们可以看到每一个信号对应一个信号和一个宏名称,以后我们给进程发送信号既可以采用发送数字的形式也可以采用发送宏名称的方式。 ...三、自定义信号的处理方式 如果我们不对收到的信号做自定义处理方式,那该信号就会按默认的方式进行处理。...自定义信号的处理方式在我的理解中有两种,一种是让收到该信号的进程处理我交给它的任务,另外一种是忽略该收到的信号,下面我会对这两种方式进行简单的演示。
信号的产生和处理是Linux系统编程中的一个关键方面,对于理解和优化系统行为至关重要 本文旨在深入探讨Linux中信号的产生机制。我们将从信号的基本概念出发,逐步解析信号的来源、触发条件。...通过本文的学习,你将能够了解信号在Linux内核中的实现原理,掌握如何编写代码来捕获和处理信号,以及如何利用信号来实现进程间的同步和通信 信号在Linux系统中的应用非常广泛,从简单的用户中断到复杂的系统监控和管理...因此,掌握信号的产生和处理机制,对于提高Linux系统编程能力、优化系统性能以及开发高效、稳定的系统应用程序具有重要意义 让我们一起踏上这段探索之旅,共同揭开Linux信号产生机制的神秘面纱!...信号捕捉初识 信号是可以被自定义捕捉的,siganl函数就是来进行信号捕捉的 代码示例: #include #include #include <unistd.h...总结 随着我们对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 强制终止进程
1、关于信号的前置知识 1.1.什么是信号? Linux系统提供的让用户(进程)给其他进程发送异步信息的一种方式。(注意信号和信号量这两者没有任何关系!)...表对应的是sigprocmask函数 调用函数sigprocmask可以读取或更改进程的信号屏蔽字(阻塞信号集)。...防止未知的core dump 一直在进行,导致服务器磁盘被打满,所以默认core是关闭的。 如何打开Linux的core功能呢?...作用:保持内存的可见性,告知编译器,被该关键字修饰的变量,不允许被优化,对该变量的任何操作,都必须在真实的内存中进行操作 编译器正常处理是将flag的值从内存读取到CPU中进行处理 当前编译器做了一个优化...读取的,因此就会造成偏差,这时候就需要我们的volatile去修饰这个变量,默认从内存中读取!
当进程正在执行某些重要任务时,如果接收到信号,可能无法立即处理,此时系统会将信号暂时保存,等到合适的时机再进行处理。...信号到了,可以不立即处理,选择在合适的时候处理:进程可以选择在合适的时机处理信号,而不是立即响应。这种灵活性使得进程能够根据自身状态和需求来处理信号。...信号的产生是随时产生的,我们无法准确预料,所以信号是异步发送的:信号是由其他用户、进程或系统事件产生的,进程无法准确预测信号的产生时机。...一般来说,abort()函数被用于发现程序中的严重错误,并且需要立即终止程序执行。...进程在接收到这样的信号后,会立即停止运行,并释放其所占用的系统资源。 除非进程已经捕获了该信号并定义了自己的信号处理函数,否则进程会按照默认的Term动作被终止。
为记录自己编程学习过程和帮助别人少走弯路而写博客 这是我的 github https://github.com/Qiuner ⭐️ gitee https://gitee.com/Qiuner...如果本篇文章帮到了你 不妨点个赞吧~ 我会很高兴的 (^ ~ ^) 想看更多 那就点个关注吧 我会尽力带来有趣的内容 u盘无法被自己的电脑上读取 硬盘插入没有任何显示 插入别人电脑硬盘能正常用
领取专属 10元无门槛券
手把手带您无忧上云