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

Linux内核编程--进程通信信号

这一篇有区别于上一篇的“信号量”机制哈 平台的手机版对排版的支持有限,建议用电脑打开此文章 一,Linux信号的概念: 信号Linux 进程间通信的最古老的方式。...在Linux终端上敲“Ctrl+c”,就产生一个“中断”,相当于产生一个信号,接着就会处理这个“中断任务”(默认的处理方式为结束掉当前进程) 2.信号可以直接进行用户空间进程和内核空间进程的交互,内核进程可以利用它来通知用户空间进程发生了哪些系统事件...b) 硬件异常将产生信号。 除数为 0,无效的内存访问等。这些情况通常由硬件检测到,并通知内核,然后内核产生适当的信号发送给相应的进程。 c) 软件异常将产生信号。...若sig=0,则不发送任何信号,但是参数检测仍然进行,这可以用来检查pid参数是否正确 kill() 系统调用最终会进入内核态,并且调用内核函数 sys_kill()函数名: int sigqueue(...Linux中可能有不同的行为。

2.9K20

Linux内核编程--信号量机制

信号量进行PV操作时都为原子操作(因为它需要保护临界资源)。 二,信号量的结构: 信号量的数据结构为一个值和一个指针,指针指向等待该信号量的下一个进程。...Linux多进程访问共享资源时,需要按下列步骤进行操作: (1)检测控制这个资源的信号量的值。 (2)如果信号量是正数,就可以使用这个资源。进程将信号量的值“减 1”,表示当前进程占用了一份资源。...四,信号量的分类: 信号量按照使用场景分为 :二值信号量和计数信号量: 二值信号量:指初始值为 1 的信号量,此类信号量只有 1 和 0 两个值,通常用来代替锁机制实现线程同步, 在一个时刻仅允许有一个资源持有者...*临界资源在同一时刻只允许一个进程使用,此时的信号量是一个二值信号量,它只控制一个资源;另一种应用于处理多个共享资源(例如多台打印机的分配),信号量在其中起到记录空闲资源数目的作用,此时的信号量是计数信号量...pthread_create(&smk_1, 0, smoker, 1); pthread_create(&smk_2, 0, smoker, 2); while(1); } Linux

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

    Linux内核33-信号

    事实上,Linux提供了两类信号量: 内核使用的信号量 用户态使用的信号量(遵循System V IPC信号量要求) 在本文中,我们集中研究内核信号量,至于进程间通信使用的信号量以后再分析。...虽然信号量可以支持很大的count,但是在linux内核中,大部分情况下还是使用信号量的一种特殊形式,也就是互斥信号量(MUTEX)。...但是,从Linux内核2.6.37版本之后,上面的函数和宏已经不存在。这是为什么呢?因为大家发现在Linux内核的设计实现中通常使用互斥信号量,而不会使用信号量。...为了更好的理解信号量,也为了尝试理解内核在设计上的一些思想和机制。我们还是先了解一下早期版本内核获取和释放信号量的过程。 因为信号量的释放过程比获取更为简单,所以我们先以释放信号量的过程为例进行分析。...基于这个原因,Linux还提供了其它版本的请求信号量的函数: down_trylock() 可以被中断和延时函数调用。

    1.5K20

    Linux】对信号产生的内核级理解

    一、键盘产生信号  键盘产生信号这里就要涉及一个重要的概念了,叫硬件中断。我这里会粗粒度地说一下键盘产生信号,以及信号被上层软件读到的过程,只是说一下我自己的理解。...当硬件设备需要CPU的注意时,它会生成一个中断信号,该信号随后被送到CPU的中断控制器。中断控制器负责管理这些信号,并确定哪个中断需要优先处理。...信号发送给进程后进程PCB中其实是用一个32位的整数来保存收到的信号的,也就是说,信号是以位图的形式被保存起来的。...向进程发送信号的本质是写入信号,将保存信号的位图对应的比特位由零置一,一个信号就算被发送给进程了。...因为发送信号要修改PCB内核数据结构的内容,所以无论产生信号的方式有多少种,最终都是由操作系统将信号写入进程PCB中的。

    10810

    Linux内核34-读写信号

    那也就是说,读/写信号量同读/写自旋锁一样,对于读操作,多个内核控制路径可以并发请求一个读写信号量;而对于写操作,每个内核控制路径必须独占访问受保护的资源。...因此,对于读/写信号量来说,写操作的时候,既不可以进行读操作,也不可以进行写操作。读/写信号量提高了内核中的并发数量,也同时提高了系统的整体性能。...内核严格按照先进先出(FIFO)的原则处理等待读/写信号量的进程。读进程或者写进程一旦请求信号量失败,就被写到信号量等待队列的队尾。当信号量被释放后,队列中的第一个进程先被执行,因为它先被唤醒。...高16位的计数器以2的补码形式表示非等待写进程和等待内核控制路径的数量,低16位表示非等待读进程和非等待写进程的总数。 wait_list 等待进程的列表。...down_read() 和 down_write()函数分别用来请求读信号量和写信号量。同理,up_read()和 up_write()函数分别用来释放读信号量和写信号量。

    1.4K10

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

    它们必须通过系统调用接口来请求内核态的服务。 1.2、内核态  内核态是操作系统的核心部分(即内核)的运行状态。在这种状态下,代码可以访问系统内的所有内存空间,并且可以执行特权指令。...内核态下的代码具有最高级别的权限,可以访问硬件、执行敏感操作,并管理系统资源。 1.3、用户态和内核态的切换时机 当用户态下的进程需要执行特权操作时,它会通过系统调用接口向内核发出请求。...在这三种情况下,操作系统都会保存用户态的上下文,并在内核态下处理这些事件。 二、信号被处理的时机  如下图所示,进程从内核态切换回用户态的时候,信号会被检测并处理。...如果该信号的处理方法为默认处理方法,就不需要从内核态切换回用户态来处理我们写的方法,但如果该信号的处理方法为我们自己的自定义处理方法,就要从内核态切换回用户态来执行,执行完毕程序再进入内核。...三、用户态和内核态切换的内核级理解 在我们的进程地址空间中存在1G的内核空间,这部分会用来映射加载到内存中的操作系统。

    12800

    Linux信号信号产生&&信号处理&&信号保存&&信号详解

    2.4 硬件异常产生信号 硬件异常被硬件以某种方式被硬件检测到并通知内核,然后内核向当前进程发送适当的信号。...被阻塞的信号产生时将保持在未决状态,直到进程解除对此信号的阻塞,才执行递达的动作 阻塞和忽略是不同的,只要信号被阻塞就不会递达,而忽略是在递达之后可选的一种处理动作 3.2 在内核中的表示 信号内核中的表示示意图...信号产生时,内核在进程控制块中设置该信号的未决标志,直到信号递达才清除该标志。...Linux是这样实现的:常规信号在递达之前产生多次只计一次,而实时信号在递达之前产生多次可以依次放在一个队列里 3.3 sigset_t 从上图来看,每个信号只有一个bit的未决标志,非0即1,不记录该信号产生了多少次...此方法对于Linux可用,但不保证在其它UNIX系统上都可用 测试代码 #include #include #include #include

    14310

    Linux信号

    进程对于信号的处理有三种:1.默认,2.忽略,3.自定义; 但并不是进程一收到信号就马上处理,因为信号是随时产生的(异步),可能当信号来临时进程正在处理着更重要的事情,进程对信号的处理会在合适的时机(内核态返回用户态时...) lgn代表内核级忽略 可以看到大部分信号的最终处理都是一样的(退出当前进程),系统设置这些信号主要是为了知道导致进程退出的原因是什么。...其实调用系统调用之所以能让我们要求操作系统帮我们获得某些数据或者访问硬件,是因为在执行系统调用的时候,首先会执行Int 80这样的汇编代码,陷入内核,让我们从用户态切换到内核态。...在寄存器中有一个CR3寄存器,该寄存器中存放的数据代表的是当前代码的执行权限(0代表内核态,3代表用户态),陷入内核以后操作系统首先会修改CR3的数据。...因为操作系统只有一封,被加载到内存中也是独一份,因此没有必须要让每个进程都独立维护一个内核级页表 信号处理全过程 首先因为信号导致的系统调用陷入内核,从用户态切换到内核态,通过寄存器中保存的PCB

    20230

    Linux进程信号信号保存】

    ---- 前言 信号从产生到执行,并不会被立即处理,这就意味着需要一种 “方式” 记录信号是否产生,对于 31 个普通信号来说,一个 int 整型就足以表示所有普通信号的产生信息了;信号还有可能被 “阻塞...的相关概念 1.1、概念 信号 传递过程:信号产生 -> 信号未决 -> 信号递达 信号产生(Produce):由四种不同的方式发出信号 信号未决(Pending):信号从 产生 到 执行 的中间状态...信号递达(Delivery):进程收到信号后,对信号的处理动作 在这三种过程之前,均有可能出现 信号阻塞 的情况 信号阻塞(Block):使信号传递 “停滞”,无论是否产生,都无法进行处理 信号递达后的三种处理方式...,本文探讨的是 信号保存阶段,即 物流信息 1.3、在内核中的表示 对于传递中的信号来说,需要存在三种状态表达: 信号是否阻塞 信号是否未决 信号递达时的执行动作 在内核中,每个进程都需要维护这三张与信号状态有关的表...---- 总结 以上就是本次关于 Linux进程信号信号保存】的全部内容了,在本文中,我们首先再一次对信号有了较深的理解,知道了在内核中存在三张表记录信号的处理流程,然后我们学习了信号集的操作函数,

    19420

    Linux信号】四:SIGCHLD信号

    SIGCHLD产生的条件 实际上,在子进程结束的时候,会产生一个SIGCHLD信号信号描述如下,根据man手册可以知道,子进程结束运行,其父进程会收到SIGCHLD信号,该信号的默认处理动作是忽略。...信号停止时; 子进程处在停止态,接受到SIGCONT后唤醒时; 既然子进程在退出或暂停的时候会发送SIGCHLD信号,那么我们就可以利用该信号,捕捉该信号,并在捕捉函数中完成子进程状态的回收,这样就不用使用...,但子进程没有继承未决信号集spending; 应该在fork之前,阻塞SIGCHLD信号,注册完捕捉函数后解除阻塞。...; 信号的处理方式必须是捕捉 (默认动作、忽略都不可以); 中断后返回-1, 设置errno为EINTR,表示被信号中断; 可以通过修改sa_flags参数来设置被信号中断后系统调用是否重启:SA_INTERRURT...sa_flags还有很多可选参数,适用于不同情况,比如:捕捉到信号后,在执行捕捉函数期间,不希望自动阻塞该信号,可将sa_flags设置为SA_NODEFER,除非sa_mask中包含该信号,等等。

    9210

    Linux 信号

    signal 信号是 UNIX 系统最先开始使用的进程间通信机制,因为 Linux 是继承于 UNIX 的,所以 Linux 也支持信号机制,通过向一个或多个进程发送 异步事件信号 来实现,信号可以从键盘或者访问不存在的位置等地方产生...你可以在 Linux 系统上输入 kill -l 来列出系统使用的信号,下面是我提供的一些信号 进程可以选择忽略发送过来的信号,但是有两个是不能忽略的:SIGSTOP 和 SIGKILL 信号。...除此之外,进程可以选择它想要处理的信号,进程也可以选择阻止信号,如果不阻止,可以选择自行处理,也可以选择进行内核处理。如果选择交给内核进行处理,那么就执行默认处理。...处于阻塞状态的进程只有再次唤醒后才会被 kill 掉 init 进程是 Linux 的初始化进程,这个进程会忽略任何信号。...当用户退出Linux登录时,前台进程组和后台有对终端输出的进程将会收到SIGHUP信号。这个信号的默认操作为终止进程,因此前台进 程组和后台有终端输出的进程就会中止。

    4.8K20

    Linux 内核Linux 内核源码结构 ( 下载 Linux 内核源码 | 使用 VSCode 阅读 Linux 内核源码 )

    文章目录 一、下载 Linux 内核源码 二、使用 VSCode 阅读 Linux 内核源码 一、下载 Linux 内核源码 ---- 参考 【Linux 内核】编译 Linux 内核 ① ( 下载指定版本的...Linux 内核源码 | Linux 内核版本号含义 | 主版本号 | 次版本号 | 小版本号 | 稳定版本 ) 博客 , 下载 Linux 5.6.18 版本的内核源码 ; 5.x 内核源码下载地址...: https://mirrors.edge.kernel.org/pub/linux/kernel/v5.x/ Linux 内核 5.6.18 版本 : https://mirrors.edge.kernel.org...参考 【错误记录】解压 Linux 内核报错 ( Can not create symbolic link : 客户端没有所需的特权 | Windows 中配置 7z 命令行执行解压操作 ) 博客 ;...不同版本的 Linux 内核 区别 : 系统调用 : 其系统调用是相同的 , 新的版本可能会增加新的系统调用 ; 设备文件 : 各内核版本的设备文件都是相同的 , 但是 内部接口 可能不同 ; 二、使用

    23.4K32

    Linux进程信号信号产生】

    ---- 前言 在 Linux 中,进程具有独立性,进程在运行后可能 “放飞自我”,这是不利于管理的,于是需要一种约定俗成的方式来控制进程的运行,这就是 进程信号,本文将会从什么是进程信号开篇,讲述各种进程信号的产生方式及作用...,部分信号只做了解即可 1.2、信号的作用 早在 《Linux进程学习【进程状态】》 我们就已经使用过 信号 了,比如: kill -9 pid 终止进程运行 kill -19 pid 暂停进程运行 kill...可以通过 man 7 signal 进行查询 man 7 signal 简单总结一下,1~31 号信号对应的功能如下(表格内容引用自 2021dragon Linux中的31个普通信号信号编号 信号名...SIGPROF 该信号类似与 SIGVTALRM,它不仅包括该进程占用 CPU 的时间还包括执行系统调用的时间,该信号的默认处理动作是终止进程 28 SIGWINCH 当窗口大小发生变化时,内核会将该信号发送至前台进程组...这个位图结构中 4.所谓的 “发送” 信号,其实就是写入信号,修改进程中位图结构中对应的比特位,由 0 置为 1,表示该信号产生了 5.signal_struct 属于内核数据结构,只能由 操作系统

    27710

    Linux进程信号信号处理】

    - 2、用户态与内核态 对于 用户态、内核态 的理解及引出的 进程地址空间 和 信号处理过程 相关知识是本文的重难点 2.1、概念 先来看看什么是 用户态和内核态 用户态:执行用户所写的代码时,就属于...与真实的地址空间建立映射关系 每个进程都有自己的 进程地址空间,不同 进程地址空间 中地址可能冲突,但实际上地址是独立的 进程地址空间 可以让进程以统一的视角看待自己的代码和数据 关于 进程地址空间 的相关知识详见 《Linux...,还需要坠入 内核态 通过一张图快速记录信号的 处理 过程 图片来源:Linux进程信号 ---- 3、信号的捕捉 接下来谈谈 信号 是如何被 捕捉 的 3.1、内核如何实现信号的捕捉?...表,信号在产生之后,存储在 pending 表中 信号处理阶段:信号内核态 切换回 用户态 时,才会被处理 ---- 总结 以上就是本次关于 Linux进程信号信号处理】的全部内容了,本文对信号的处理时机做了探讨...,然后学习了 用户态 和 内核态 的相关内容,最后学习了 信号的捕捉 过程,至此 进程信号 部分内容已经全部完

    23010

    Linux 内核Linux 内核源码结构 ( 下载 Linux 内核源码 | 使用 VSCode 阅读 Linux 内核源码 )

    文章目录 一、下载 Linux 内核源码 二、使用 VSCode 阅读 Linux 内核源码 一、下载 Linux 内核源码 ---- 参考 【Linux 内核】编译 Linux 内核 ① ( 下载指定版本的...Linux 内核源码 | Linux 内核版本号含义 | 主版本号 | 次版本号 | 小版本号 | 稳定版本 ) 博客 , 下载 Linux 5.6.18 版本的内核源码 ; 5.x 内核源码下载地址...: https://mirrors.edge.kernel.org/pub/linux/kernel/v5.x/ Linux 内核 5.6.18 版本 : https://mirrors.edge.kernel.org...不同版本的 Linux 内核 区别 : 系统调用 : 其系统调用是相同的 , 新的版本可能会增加新的系统调用 ; 设备文件 : 各内核版本的设备文件都是相同的 , 但是 内部接口 可能不同 ; 二、使用...按钮 , 此时就可以在 VSCode 中阅读 Linux 内核源码 ;

    21.3K30

    Linux信号】三:信号的捕捉

    注册一个信号捕捉函数,该函数由ANSI定义,由于历史原因在不同版本的Unix和不同版本的Linux中可能有不同的行为。因此应该尽量避免使用它,取而代之使用sigaction函数。...,恢复原来的信号屏蔽字,内核处理SIGQUIT,程序退出。...2.2 内核是如何捕捉信号的 我们拿上面的程序为例,程序正常执行的时候,应该是一直在循环体内打印一句话,直到有信号产生 while(1) { printf("pid: %d\n", getpid...()); sleep(1); } 当产生信号的时候,会进入内核态,此时内核会执行信号处理函数,如果有用户自定义信号处理函数会再次返回用户态去执行该函数。...执行完信号处理函数后通过系统调用sigreturn再次陷入内核,然后返回用户态从被中断的地方继续执行主控制逻辑。

    13410

    linux内核编程_linux内核是什么

    内核——操作系统的内在核心 设备驱动程序 启动引导程序 命令行shell 其他种类的用户界面—-操作系统的外在表象 基本的文件管理工具和系统工具 Linux内核的组成 Linux内核源代码目录结构是什么...信号量、共享内存、管道、消息队列、Socket通信、Binder通信 ARM处理器有几种工作模式?...Makefile:分布在Linux 内核源代码中的Makefile,定义Linux 内核的编译规则。 配置文件(Kconfig):给用户提供配置选择的功能。...记录哪些部分被编译入内核、哪些部分被编译为内核模块。 在Linux 内核中增加程序需要完成哪些工作? 将编写的源代码复制到Linux 内核源代码的相应目录。...次引导加载程序加载Linux内核和可选的初始RAM 磁盘,将控制权交给Linux内核源代码。 运行被加载的内核,并启动用户空间应用程序。

    18.9K30

    Linux信号概念与信号产生

    信号概念与信号产生 一、初识信号 1. 信号概念 生活中类似信号的概念也不少,例如上课铃声响,就是信号的发出,我们听到上课铃声,就是接收到信号,我们快速回到教室上课就是对信号做出处理。...此时我们运行程序,我们可以输入指令,bash 可以接收我们的指令,也就是说我们还能正常使用 bash 命令行,但是此时我们使用 ctrl + c 就杀不掉该进程了,这种进程我们称为后台进程,如下图: 在Linux...我们可以查看Linux中的信号列表,指令为: kill -l 其中我们发现,0号、32号和33号信号是没有的。...也就是一共有62个信号;其中我们把 1~31 号信号称为普通信号;往后的称为实时信号,当信号产生必须立即处理就是实时信号;其中我们只学习普通信号。...技术应用角度的信号 接下来我们了解一下,键盘数据是如何输入给内核的,ctrl + c 又是如何变成信号的。 首先我们需要知道,键盘被按下,肯定是操作系统先知道,因为键盘设备并不能被进程直接访问。

    18310

    内核的“信号处理”——发送与响应

    如果应用程序没有注册过SIGPIPE信号处理函数,内核则会执行SIGPIPE的默认处理即终止当前进程。...任何有权限的用户或者进程都可以给另外一个进程发送信号,如使用kill命令。其内核实现也很简单。...所以,目的进程的信号响应,一定是由内核检查并完成的。...既要满足信号可以打断应用程序执行流程,又要保证性能,只有在目的进程陷入内核态,并返回用户态之前,完成信号响应和处理,是最为合适的。 而目的进程什么情况下会陷入内核态呢?...“信号”的响应总结为一句话:应用态进程由于系统调用、中断或异常,而陷入内核态后,在返回应用态之前,内核会进行信号的检查和处理。 PS: 本文中的示例程序没有考虑代码的健壮性。

    1.9K40

    Linux信号基础

    Linux进程基础一文中已经提到,Linux以进程为单位来执行程序。我们可以将计算机看作一个大楼,内核(kernel)是大楼的管理员,进程是大楼的房客。...但正是由于传递的信息量少,信号也便于管理和使用。信号因此被经常地用于系统管理相关的任务,比如通知进程终结、中止或者恢复等等。 ? 给我一个信号 信号是由内核(kernel)管理的。...信号的产生方式多种多样,它可以是内核自身产生的,比如出现硬件错误(比如出现分母为0的除法运算,或者出现segmentation fault),内核需要通知某一进程;也可以是其它进程产生的,发送给内核,再由内核传递给目标进程...内核中针对每一个进程都有一个表存储相关信息(房间的信箱)。当内核需要将信号传递给某个进程时,就在该进程相对应的表中的适当位置写入信号(塞入纸条),这样,就生成(generate)了信号。...特别是获取信号的情况,程序往往会设置一些比较长而复杂的操作(通常将这些操作放到一个函数中)。 信号常常被用于系统管理,所以它的内容相当庞杂。深入了解信号,需要一定的Linux环境编程知识。

    2.5K50
    领券