这一篇有区别于上一篇的“信号量”机制哈 平台的手机版对排版的支持有限,建议用电脑打开此文章 一,Linux信号的概念: 信号是 Linux 进程间通信的最古老的方式。...信号是软件中断,它是在软件层次上对中断机制的一种模拟。...在Linux终端上敲“Ctrl+c”,就产生一个“中断”,相当于产生一个信号,接着就会处理这个“中断任务”(默认的处理方式为结束掉当前进程) 2.信号可以直接进行用户空间进程和内核空间进程的交互,内核进程可以利用它来通知用户空间进程发生了哪些系统事件...终端上按“Ctrl+c”组合键通常产生中断信号 SIGINT 终端上按“Ctrl+\”键通常产生中断信号 SIGQUIT 终端上按“Ctrl+z”键通常产生中断信号 SIGSTOP 等。...Linux中可能有不同的行为。
四、信号与中断的区别 信号与中断的相似点: (1)采用了相同的异步通信方式; (2)当检测出有信号或中断请求时,都暂停正在执行的程序而转去执行相应的处理程序; (3)都在处理完毕后返回到原来的断点...; (4)对信号或中断都可进行屏蔽。...信号与中断的区别: (1)中断有优先级,而信号没有优先级,所有的信号都是平等的; (2)信号处理程序是在用户态下运行的,而中断处理程序是在核心态下运行; (3)中断响应是及时的,而信号响应通常都有较大的时间延迟...然后它调用schedule(),使linux进程调度器找到另一个进程来运行。pause使调用者进程挂起,直到一个信号被捕获处理后函数才返回。...参考:《APUE》、《linux c 编程一站式学习》
sockfd, (struct sockaddr *)&client_addr, NULL); if(clientfd < 0) { if(error == EINTR) // 信号中断处理...exit(0); } ... } 扩充的socket编程 1. ...首先是对socket的一些可能出现错误的函数进行再封装处理,比如accept可能出现多种错误,若只是简单的退出,则对服务器的安全性将有很大的挑战;这里对于最常见的信号中断处理,进行了再次封装 clientfd...sockfd, (struct sockaddr *)&client_addr, NULL); if(clientfd < 0) { if(error == EINTR) // 信号中断处理...除了accept之外,对于send,recv函数同样需要再次封装处理,以确保能正确的接收到数据和正确的发送完数据.下面给出了最常见的错误处理,特别是对于信号中断,一般都有做出要求 char client_ip
这个小任务对于大多数读者应该来说是小菜一碟的的,可以直接来看示例代码(今后写代码编程全程在vim里面写,虽然不舒服,还是要习惯的,hh): #include #include <string.h...hello pthread jjjkj the input words is 5 jjkl;j the input words is 6 end over 注意: 这里在Linux...不过在这之前还是要稍微介绍一下什么是线程信号量,其实这个跟进程通信有点类似——Linux进程编程----syslog的使用和进程间通信的介绍(六): a、那么什么是信号量呢?...整型信号量(integer semaphore):信号量取值是整数,它可以被多个线程同时获得,直到信号量的值变为0。...当信号量被释放一个,值被加一后,系统自动从等待队列中唤醒一个等待中的线程,让其获得信号量,同时信号量再减一。
在信号量进行PV操作时都为原子操作(因为它需要保护临界资源)。 二,信号量的结构: 信号量的数据结构为一个值和一个指针,指针指向等待该信号量的下一个进程。...Linux多进程访问共享资源时,需要按下列步骤进行操作: (1)检测控制这个资源的信号量的值。 (2)如果信号量是正数,就可以使用这个资源。进程将信号量的值“减 1”,表示当前进程占用了一份资源。...四,信号量的分类: 信号量按照使用场景分为 :二值信号量和计数信号量: 二值信号量:指初始值为 1 的信号量,此类信号量只有 1 和 0 两个值,通常用来代替锁机制实现线程同步, 在一个时刻仅允许有一个资源持有者...六,具体的编程练习 信号量编程步骤: 1.定义信号量:sem_t 2.初始化信号量:sem_init(sem_t *); 3.加锁:sem_wait() 4.执行业务逻辑代码 5.解锁:sem_post...pthread_create(&smk_1, 0, smoker, 1); pthread_create(&smk_2, 0, smoker, 2); while(1); } Linux
一、sigqueue函数 功能:新的发送信号系统调用,主要是针对实时信号提出的支持信号带有参数,与函数sigaction()配合使用。...,而不能是进程组 return 0; } 测试如下: 先运行recv程序: simba@ubuntu:~/Documents/code/linux_programming/APUE/signal.../sigqueue_recv 再ps出recv进程的pid,然后运行send程序: simba@ubuntu:~/Documents/code/linux_programming/APUE/signal...; sleep(3); kill(pid, SIGUSR1); return 0; } 先是运行recv程序: simba@ubuntu:~/Documents/code/linux_programming.../sigrtime_recv2 接着ps出recv进程的pid,运行send程序: simba@ubuntu:~/Documents/code/linux_programming/APUE/signal
一、信号在内核中的表示 实际执行信号的处理动作称为信号递达(Delivery),信号从产生到递达之间的状态,称为信号未决(Pending)。...,使其中所有信号的对应bit清零,表示该信号集不包含任何有效信号。...函数sigfillset初始化set所指向的信号集,使其中所有信号的对应bit置位,表示该信号集的有效信号包括系统支持的所有信号。...; flag = 1; } } 如果将程序中的37,57,58,75关于flag变量的语句注释掉,则输出如下: simba@ubuntu:~/Documents/code/linux_programming...参考:《APUE》、《linux c 编程一站式学习》
[toc] 如何设置IDT IDT 中断描述符表定义 中断描述符表简单来说说是定义了发生中断/异常时,CPU按这张表中定义的行为来处理对应的中断/异常。...中断描述符项定义 当中断发生,cpu获取到中断向量后,查找IDT中断描述符表得到相应的中断描述符,再根据中断描述符记录的信息来作权限判断,运行级别转换,最终调用相应的中断处理程序; 这里涉及到Linux...pre-cpu的中断栈,还是使用IST的中断栈; type表示所中断是何种类型,目前有以下四种: enum { GATE_INTERRUPT = 0xE, //中断门 GATE_TRAP...传统系统调用相关 IDT 的设置 Linux系统启动过程中内核压解后最终都调用到start_kernel, 在这里会调用trap_init, 然后又会调用idt_setup_traps: void...硬件中断相关IDT的初始化也是在Linux启动时完成,在start_kernel中通过调用init_IRQ完成,我们来看一下: void __init init_IRQ(void) { int
中断处理 - 上半部(硬中断) 由于 APIC中断控制器 有点小复杂,所以本文主要通过 8259A中断控制器 来介绍Linux对中断的处理过程。...handler: 类型为 hw_interrupt_type 结构,表示IRQ线对应的硬件相关处理函数,比如 8259A中断控制器 接收到一个中断信号时,需要发送一个确认信号才会继续接收中断信号的,发送确认信号的函数就是...action: 类型为 irqaction 结构,中断信号的处理入口。由于一条IRQ线可以被多个硬件共享,所以 action 是一个链表,每个 action 代表一个硬件的中断处理入口。...处理中断请求 当一个中断发生时,中断控制层会发送信号给CPU,CPU收到信号会中断当前的执行,转而执行中断处理过程。...这里要注意的是,如果中断处理过程能够开启中断的,那么就把中断打开(因为CPU接收到中断信号时会关闭中断)。
用户程序注册了SIGQUIT信号的处理函数sighandler。 2. 当前正在执行main函数,这时发生中断或异常切换到内核态。 3....在中断处理完毕后要返回用户态的main函数之前检查到有信号SIGQUIT递达。 4....simba@ubuntu:~/Documents/code/linux_programming/APUE/signal$ ....()实现的; 《Linux 多线程应用中如何编写安全的信号处理函数》 http://www.ibm.com/developerworks/cn/linux/l-cn-signalsec/ 参考:《APUE...》、《linux c 编程一站式学习》
大家好,我是道哥,今天我为大伙儿解说的技术知识点是:【中断程序如何发送信号给应用层】。 最近分享的几篇文章都比较基础,关于字符类设备的驱动程序,以及中断处理程序。...今天这篇文章,主要还是以代码实例为主,把之前的两个知识点结合起来: 在中断处理函数中,发送信号给应用层,以此来通知应用层处理响应的中断业务。...> #include #include #include // 中断号...request_irq(IRQ_NUM, myirq_handler, IRQF_SHARED, MYDEV_NAME, &mydev); ... } 在中断处理函数中,目标是发送信号 SIGUSR1...根据之前的文章Linux驱动实践:驱动程序如何发送【信号】给应用程序?,应用程序必须主动把自己的 PID 告诉驱动模块才可以。
指向函数的指针) sighandler_t signal(int signum, sighandler_t handler); 1.函数原型 2.使用自定义的类型别名,作为函数参数和函数返回值 3.第一个参数是信号的标号...> #include #include //申明一个自定义函数 void myHandler(int signum){ printf("捕获到信号...\n"); sleep(1); } } 运行结果: 信号2是我ctrl+c , 信号15是我kill 进程id , 但是当我kill -9...进程id时 , 使用signal(SIGKILL,handler) 信号不能被捕获 进程运行中......^C捕获到信号 2 进程运行中... 进程运行中... 进程运行中... 捕获到信号 15
用户按下Ctrl-C ,这个键盘输入产生一个硬件中断,被OS获取,解释成信号,发送给目标前台进程 前台进程因为收到信号,进而引起进程退出 #include #include <unistd.h...)的 1.3 信号概念 信号是进程之间事件异步通知的一种方式,属于软中断 用kill -l命令可以察看系统定义的信号列表 每个信号都有一个编号和一个宏定义名称,这些宏定义可以在signal.h中找到,...Linux是这样实现的:常规信号在递达之前产生多次只计一次,而实时信号在递达之前产生多次可以依次放在一个队列里 3.3 sigset_t 从上图来看,每个信号只有一个bit的未决标志,非0即1,不记录该信号产生了多少次...当前正在执行main函数,这时发生中断或异常切换到内核态。在中断处理完毕后要返回用户态的main函数之前检查到有信号SIGQUIT递达。...此方法对于Linux可用,但不保证在其它UNIX系统上都可用 测试代码 #include #include #include #include
一.信号基础 生活中 在生活中也有诸多信号,这些信号通常不是由我们发起的,而是我们接收以后对对应的信号做处理;最常见的莫过于红绿灯了,当红绿灯发出信号时(红灯,绿灯,黄灯);我们会有对应的行为,比如绿灯我们知道当前可以行走...对信号产生以后我们知道该做什么,这是因为我们曾经接受了对于这些信号的教育,知道当这些信号产生以后我们需要做什么。...使用kill -l可以查看全部的信号 其中1-31为普通信号,34-64被称为实时信号 进程PCB中有一个位图结构用于标明该进程是否收到信号(32个比特位使用0/1来区分是否收到信号,0代表没收到...进程对于信号的处理有三种:1.默认,2.忽略,3.自定义; 但并不是进程一收到信号就马上处理,因为信号是随时产生的(异步),可能当信号来临时进程正在处理着更重要的事情,进程对信号的处理会在合适的时机(内核态返回用户态时...,如果该信号一直处于未递达的状态,那么即使后续发送了该信号也无法收到 五.信号的处理 因为信号保存在PCB中,但PCB中的数据只有操作系统有权限访问,因此要对信号做处理必须要通过操作系统来实现。
今日更新了Linux信号的内容 欢迎大家关注点赞收藏⭐️留言 信号和信号量 二者之间没有任何关系。 信号 通过 kill -l 可以查看所有信号 其中,1-31号信号是普通信号。...这些信号各自在什么条件下产生,默认的处理动作是什么,在signal(7)中都有详细说明: man 7 signal 基本结论: 信号:Linux系统提供的一种,向指定进程发送特定事件的方式。...sigset_t就是Linux给用户提供的一个用户级的数据类型,禁止用户直接修改位图。...由于信号处理函数的代码是在用户空间的,处理过程比较复杂,举例如下: 用户程序注册了SIGQUIT信号的处理函数sighandler。 当前正在执行 main函数,这时发生中断或异常切换到内核态。...在中断处理完毕后要返回用户态的main函数之前检查到有信号 SIGQUIT递达。
---- 前言 在 Linux 中,进程具有独立性,进程在运行后可能 “放飞自我”,这是不利于管理的,于是需要一种约定俗成的方式来控制进程的运行,这就是 进程信号,本文将会从什么是进程信号开篇,讲述各种进程信号的产生方式及作用...可以通过 man 7 signal 进行查询 man 7 signal 简单总结一下,1~31 号信号对应的功能如下(表格内容引用自 2021dragon Linux中的31个普通信号) 信号编号 信号名...捕获键盘 “按下” 信号的操作称为 硬件中断 CPU 中有很多的针脚,不同的硬件对应着不同的针脚,每一个针脚都有自己的编号,硬件与针脚一对一相连,并通过 中断控制器(比如 8259)进行控制,当我们按下键盘后...中断控制器首先给 CPU 发送信息,包括键盘对应的针脚号 然后 CPU 将获取到的针脚号(中断号)写入 寄存器 中 最后根据 寄存器 里的 中断号,去 中断向量表 中查表,找到对应硬件的方法,执行它的读取方法就行了...同样是 先检测到信号,然后再去执行相应的动作,不过此时发送的是 中断信号,执行的是 调用相应方法罢了 信号 与 动作 的设计方式很实用,操作系统只需要关注是否有信号发出,发出后去中断向量表中调用相应的方法即可
---- 前言 信号从产生到执行,并不会被立即处理,这就意味着需要一种 “方式” 记录信号是否产生,对于 31 个普通信号来说,一个 int 整型就足以表示所有普通信号的产生信息了;信号还有可能被 “阻塞...的相关概念 1.1、概念 信号 传递过程:信号产生 -> 信号未决 -> 信号递达 信号产生(Produce):由四种不同的方式发出信号 信号未决(Pending):信号从 产生 到 执行 的中间状态...信号递达(Delivery):进程收到信号后,对信号的处理动作 在这三种过程之前,均有可能出现 信号阻塞 的情况 信号阻塞(Block):使信号传递 “停滞”,无论是否产生,都无法进行处理 信号递达后的三种处理方式...,本文探讨的是 信号保存阶段,即 物流信息 1.3、在内核中的表示 对于传递中的信号来说,需要存在三种状态表达: 信号是否阻塞 信号是否未决 信号递达时的执行动作 在内核中,每个进程都需要维护这三张与信号状态有关的表...---- 总结 以上就是本次关于 Linux进程信号【信号保存】的全部内容了,在本文中,我们首先再一次对信号有了较深的理解,知道了在内核中存在三张表记录信号的处理流程,然后我们学习了信号集的操作函数,
这样做的目的是,假如在注册信号捕捉函数之前子进程就已经结束的话,信号捕捉函数就什么也捕捉不到了,会产生僵尸进程; 3. 中断系统调用 系统调用可分为两类:慢速系统调用和其他系统调用。...如果在阻塞期间收到一个信号,该系统调用就被中断,不再继续执行(早期),也可以设定系统调用是否重启。比如,read、write、pause、wait等。...其他系统调用:getpid、getppid、fork等 通过pause系统调用,分析慢速系统调用,慢速系统调用被中断的相关行为,实际上就是pause的行为,比 如read 慢速系统调用被中断的相关行为...,实际上就是pause的行为,比 如read 想中断pause,首先信号不能被屏蔽; 信号的处理方式必须是捕捉 (默认动作、忽略都不可以); 中断后返回-1, 设置errno为EINTR,表示被信号中断...; 可以通过修改sa_flags参数来设置被信号中断后系统调用是否重启:SA_INTERRURT不重启, SA_RESTART重启。
signal 信号是 UNIX 系统最先开始使用的进程间通信机制,因为 Linux 是继承于 UNIX 的,所以 Linux 也支持信号机制,通过向一个或多个进程发送 异步事件信号 来实现,信号可以从键盘或者访问不存在的位置等地方产生...操作系统会中断目标程序的进程来向其发送信号、在任何非原子指令中,执行都可以中断,如果进程已经注册了信号处理程序,那么就执行进程,如果没有注册,将采用默认处理的方式。...SIGBUS SIGBUS 将造成 总线中断 错误时发送给进程 SIGCHLD 当子进程终止、被中断或者被中断恢复,将 SIGCHLD 发送给进程。...SIGILL SIGILL 信号在尝试执行非法、格式错误、未知或者特权指令时发出 SIGINT 当用户希望中断进程时,操作系统会向进程发送 SIGINT 信号。...用户输入 ctrl - c 就是希望中断进程。 SIGKILL SIGKILL 信号发送到进程以使其马上进行终止。
,运行相应的进程 系统调用结束后 异常、中断、陷阱等处理完毕 信号的处理时机就是 内核态 切换为 用户态,也就是 当把更重要的事做完后,进程才会在操作系统的指导下,对信号进行检测、处理 下面来结合 进程地址空间...与真实的地址空间建立映射关系 每个进程都有自己的 进程地址空间,不同 进程地址空间 中地址可能冲突,但实际上地址是独立的 进程地址空间 可以让进程以统一的视角看待自己的代码和数据 关于 进程地址空间 的相关知识详见 《Linux...操作系统的本质 - 操作系统也是软件啊,并且是一个死循环式等待指令的软件 - 存在一个硬件:操作系统时钟硬件,每隔一段时间向操作系统发送时钟中断 进程被调度,就意味着它的时间片到了,操作系统会通过时钟中断...处理 过程 图片来源:Linux进程信号 ---- 3、信号的捕捉 接下来谈谈 信号 是如何被 捕捉 的 3.1、内核如何实现信号的捕捉?...表,信号在产生之后,存储在 pending 表中 信号处理阶段:信号在 内核态 切换回 用户态 时,才会被处理 ---- 总结 以上就是本次关于 Linux进程信号【信号处理】的全部内容了,本文对信号的处理时机做了探讨
领取专属 10元无门槛券
手把手带您无忧上云