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

Linux信号】二:未决信号、阻塞信号信号操作函数

阻塞信号与未决信号 Linux内核的进程控制块PCB是一个结构体task_struct,除了包含进程id、状态、工作目录、用户id、组id、文件描述符表、还包含了信号相关的信息,主要指阻塞信号和未决信号...信号设定函数 #include typedef unsigned long sigset_t; /*信号类型,其实就是一个32位的字*/ /*清空信号,将某个信号清0*/...int sigemptyset(sigset_t *set); /*填充信号,将某个信号置1*/ int sigfillset(sigset_t *set); /*将某个信号signum加入信号...SIG_SETMASK:替换信号,set表示用于替代原始屏蔽的新屏蔽,相当于 mask = set,直接把传入的set设置为当前阻塞信号。...获取当前进程的未决信号。 函数参数 set:传出参数,传出当前未决信号

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

    进程同步(三)—— 信号

    程序在执行过程经常产生信号,有些是由内核发出,有些是由用户发出。 执行命令kill -l可以查看信号。 这些信号由系统定义,他们不是简单的int之类的数据类型,可能是调用一些函数。...这些信号中,10/12是给用户预留使用的,其他信号各有自己相应的含义。代码中无法完美的自定义信号,容易覆盖或产生系统错误,所以还是乖乖用系统提供的信号吧。...信号类似QT的信号槽的关系,一个信号对应一个处理函数,可以对相应的信号进行屏蔽之类的处理。 信号处理函数属于可重入函数,可以随时中断,允许多个副本执行。...信号处理属于异步处理,和主程是分开执行的,内核发送信号只发送一次。一般处理函数仅仅用于通知主程收到信号,有主程处理具体内容。...下面是信号处理代码,分别是内核发送的子进程结束信号和用户自定义信号

    80030

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

    Linux是这样实现的:常规信号在递达之前产生多次只计一次,而实时信号在递达之前产生多次可以依次放在一个队列里 3.3 sigset_t 从上图来看,每个信号只有一个bit的未决标志,非0即1,不记录该信号产生了多少次...“有效”和“无效”的含义是该信号是否处于未决状态 阻塞信号也叫做当前进程的信号屏蔽字(Signal Mask),这里的“屏蔽”应该理解为阻塞而不是忽略 3.4 信号操作函数 sigset_t类型对于每种信号用一个...,使其中所有信号的对应bit清零,表示该信号不包含任何有效信号 函数sigfillset初始化set所指向的信号,使其中所有信号的对应bit置位,表示该信号的有效信号包括系统支持的所有信号 注意,...#include sigpending 读取当前进程的未决信号,通过set参数传出。...while (true) { std::cout << "father running" << std::endl; sleep(1); } } 我的博客即将同步至腾讯云开发者社区

    15810

    Linux 信号

    signal 信号是 UNIX 系统最先开始使用的进程间通信机制,因为 Linux 是继承于 UNIX 的,所以 Linux 也支持信号机制,通过向一个或多个进程发送 异步事件信号 来实现,信号可以从键盘或者访问不存在的位置等地方产生...你可以在 Linux 系统上输入 kill -l 来列出系统使用的信号,下面是我提供的一些信号 进程可以选择忽略发送过来的信号,但是有两个是不能忽略的:SIGSTOP 和 SIGKILL 信号。...处于阻塞状态的进程只有再次唤醒后才会被 kill 掉 init 进程是 Linux 的初始化进程,这个进程会忽略任何信号。...当用户退出Linux登录时,前台进程组和后台有对终端输出的进程将会收到SIGHUP信号。这个信号的默认操作为终止进程,因此前台进 程组和后台有终端输出的进程就会中止。...不过可以捕获这个信号,比如wget能捕获SIGHUP信号,并忽略它,这样就算退出了Linux登录,wget也 能继续下载。 此外,对于与终端脱离关系的守护进程,这个信号用于通知它重新读取配置文件。

    4.8K20

    Linux信号

    上述的图也可以简化成下面这样 六.信号操作函数 1.sigset_t 每个信号只有一个bit的未决标志,非0即1,不记录该信号产生了多少次,阻塞标志也是这样表示的。...因此,未决和阻塞标志可以用相同的数据类型sigset_t来存储,sigset_t称为信号,这个类型可以表示每个信号的“有效”或“无效”状态,在阻塞信号集中“有效”和“无效”的含义是该信号是否被阻塞,而在未决信号集中...);//使其中所有信号的对应bit置位,表示 该信号的有效信号包括系统支持的所有信号 int sigaddset (sigset_t *set, int signo); int sigdelset(sigset_t...---- 2.sigprocmask 调用sigprocmask可以读取或更改进程的信号屏蔽字(阻塞信号) #include int sigprocmask(int how,...遍历打印pengding信号 int cnt = 10; while(true) { // 初始化 sigemptyset(&pending);

    20730

    Linux进程信号信号处理】

    处理 过程 图片来源:Linux进程信号 ---- 3、信号的捕捉 接下来谈谈 信号 是如何被 捕捉 的 3.1、内核如何实现信号的捕捉?...,不用管 sigset_t sa_mask; //待屏蔽的信号 int sa_flags; //一些选项,一般设为 0 void (*sa_restorer)(void...,直到 用户自定义动作 执行完成 也就是说,我们可以提前设置一批 待阻塞 的 屏蔽信号,当执行 signum 中的 用户自定义动作 时,这些 屏蔽信号 中的 信号 将会被 屏蔽(避免干扰 用户自定义动作...3、4、5 信号的 阻塞 状态解除,立即被 递达,进程就被干掉了 注意: 屏蔽信号 sa_mask 中已屏蔽的信号,在 用户自定义动作 执行完成后,会自动解除 阻塞 状态 ---- 4、信号部分小结...表,信号在产生之后,存储在 pending 表中 信号处理阶段:信号在 内核态 切换回 用户态 时,才会被处理 ---- 总结 以上就是本次关于 Linux进程信号信号处理】的全部内容了,本文对信号的处理时机做了探讨

    24710

    Linux信号

    今日更新了Linux信号的内容 欢迎大家关注点赞收藏⭐️留言 信号信号量 二者之间没有任何关系。 信号 通过 kill -l 可以查看所有信号 其中,1-31号信号是普通信号。...这些信号各自在什么条件下产生,默认的处理动作是什么,在signal(7)中都有详细说明: man 7 signal 基本结论: 信号:Linux系统提供的一种,向指定进程发送特定事件的方式。...阻塞信号也叫做当前进程的信号屏蔽字(Signal Mask),这里的“屏蔽”应该理解为阻塞而不是忽略。...sigset_t就是Linux给用户提供的一个用户级的数据类型,禁止用户直接修改位图。...sigismember是一个布尔函数,用于判断一个信号的有效信号中是否包含某种信号,若包含则返回1,不包含则返回0,出错返回-1。

    5710

    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中包含该信号,等等。

    13410

    Linux进程信号信号产生】

    ---- 前言 在 Linux 中,进程具有独立性,进程在运行后可能 “放飞自我”,这是不利于管理的,于是需要一种约定俗成的方式来控制进程的运行,这就是 进程信号,本文将会从什么是进程信号开篇,讲述各种进程信号的产生方式及作用...,部分信号只做了解即可 1.2、信号的作用 早在 《Linux进程学习【进程状态】》 我们就已经使用过 信号 了,比如: kill -9 pid 终止进程运行 kill -19 pid 暂停进程运行 kill...可以通过 man 7 signal 进行查询 man 7 signal 简单总结一下,1~31 号信号对应的功能如下(表格内容引用自 2021dragon Linux中的31个普通信号信号编号 信号名...,立即终止进程 到目前为止,我们学习了很多信号,分别对应着不同的情况,其中有些信号还反映了异常信息,所以将信号进行细分,还是很有必要的 ---- 6、核心转储 Linux 中提供了一种系统级别的能力,当一个进程在出现异常的时候...),不再设置退出码,而是设置 core dump 位 及 终止信号 也就是说,父进程可以借此判断子进程是否产生了 核心转储 文件 ---- 总结 以上就是本次关于 Linux进程信号信号产生】的全部内容了

    30910

    Linux进程信号信号保存】

    ,其中既可以表示 block 表信息,也可以表示 pending 表信息,可以通过信号操作函数进行获取对应的信号信息;信号 的主要功能是表示每个信号的 “有效” 或 “无效” 状态 block...表 通过信号称为 阻塞信号信号屏蔽字(屏蔽表示阻塞),pending 表 通过信号集中称为 未决信号 如何根据 sigset_t 位图结构进行比特位的操作?...注意: 针对信号的 增删改查 都需要通过 系统调用 来完成,不能擅自使用位运算 sigprocmask、sigpending 这两个函数的参数都是 信号,前者是 屏蔽信号,后者是 未决信号 在对...信号 进行增删改查前,一定要先初始化 信号在被解除 阻塞状态 后,很快就会 递达 了 关于信号何时递达、以及递达后的处理动作,在下一篇文章中揭晓 以上关于 信号信号 的操作都是在进程中进行的,不影响操作系统...---- 总结 以上就是本次关于 Linux进程信号信号保存】的全部内容了,在本文中,我们首先再一次对信号有了较深的理解,知道了在内核中存在三张表记录信号的处理流程,然后我们学习了信号的操作函数,

    20220

    Linux信号】三:信号的捕捉

    signal() varies across Unix versions, and has also varied historically across different versions of Linux...注册一个信号捕捉函数,该函数由ANSI定义,由于历史原因在不同版本的Unix和不同版本的Linux中可能有不同的行为。因此应该尽量避免使用它,取而代之使用sigaction函数。...sa_mask 调用信号处理函数时,所要屏蔽的信号集合(信号屏蔽字)。注意:仅在处理函数被调用期间屏蔽生效,是临时性设置。实际上就是执行捕捉函数期间临时屏蔽的信号。...当注册了某个信号捕捉函数,在捕捉到该信号以后,就要调用该信号捕捉函数,而该函数有可能执行很长时间,在这期间所要屏蔽的信号不由M来指定,而是用sa_mask(临时屏蔽信号)来指定,等到调用完信号处理函数...实际上是这样的,未决信号集中使用某一位的0和1来记录信号是否被处理的,所以不管这个信号被发送了几次,未决信号对应位也只能有一个1,后续也只能处理一次,它不会记录信号屏蔽期间总共发送了几次该信号,解除屏蔽后只会处理一次

    14110

    Linux信号概念与信号产生

    信号概念与信号产生 一、初识信号 1. 信号概念 生活中类似信号的概念也不少,例如上课铃声响,就是信号的发出,我们听到上课铃声,就是接收到信号,我们快速回到教室上课就是对信号做出处理。...那么我们是怎么认识这些信号的呢?那必定是有人教我们,然后我们记住了。而且我们不单单要认识信号,还要识别信号,知道信号的处理方法!...此时我们运行程序,我们可以输入指令,bash 可以接收我们的指令,也就是说我们还能正常使用 bash 命令行,但是此时我们使用 ctrl + c 就杀不掉该进程了,这种进程我们称为后台进程,如下图: 在Linux...我们可以查看Linux中的信号列表,指令为: kill -l 其中我们发现,0号、32号和33号信号是没有的。...也就是一共有62个信号;其中我们把 1~31 号信号称为普通信号;往后的称为实时信号,当信号产生必须立即处理就是实时信号;其中我们只学习普通信号

    19010

    Linux同步机制(二) - 条件变量,信号量,文件锁,栅栏

    1 条件变量 条件变量是一种同步机制,允许线程挂起,直到共享数据上的某些条件得到满足。...条件变量是一种同步机制,允许线程挂起,直到共享数据上的某些条件得到满足。条件变量上的基本操作有:触发条件(当条件变为true时);等待条件,挂起线程直到其他线程触发条件。 2....条件变量函数不是异步信号安全的,不应当在信号处理程序中进行调用。...Hello World 3 文件锁 3.1 文件锁介绍 linux下可以使用flock函数对文件进行加锁解锁等操作。...4 栅栏 4.1 相关函数 pthread_barrier 系列函数在中定义,用于多线程的同步,它包含三个函数: #include int pthread_barrier_init

    2.9K111

    Linux信号基础

    Linux进程基础一文中已经提到,Linux以进程为单位来执行程序。我们可以将计算机看作一个大楼,内核(kernel)是大楼的管理员,进程是大楼的房客。...如果有信号,进程会执行对应该信号的操作(signal action, 也叫做信号处理signal disposition),此时叫做执行(deliver)信号。...从信号的生成到信号的传递的时间,信号处于等待(pending)状态(纸条还没有被查看)。...常见信号 信号所传递的每一个整数都被赋予了特殊的意义,并有一个信号名对应该整数。常见的信号有SIGINT, SIGQUIT, SIGCONT, SIGTSTP, SIGALRM等。这些都是信号的名字。...特别是获取信号的情况,程序往往会设置一些比较长而复杂的操作(通常将这些操作放到一个函数中)。 信号常常被用于系统管理,所以它的内容相当庞杂。深入了解信号,需要一定的Linux环境编程知识。

    2.5K50
    领券