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

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

称为信号集,可以用来修改进程block位图中的信号屏蔽字。...3.2、设置信号屏蔽字 利用sigprocmask系统调用函数可以设置进程的信号屏蔽字 第一个参数how有三个选项: SIG_BLOCK:set包含了我们希望添加到当前信号屏蔽字中的信号,相当于mask...SIG_SETMASK:设置当前信号屏蔽字为set所指向的值,相当于mask=set。 第二个参数set是我们设置的信号屏蔽字,第三个参数为输出型信号屏蔽字,是原来的信号屏蔽字。...3.3、设置信号屏蔽字的例子 下面是一个设置屏蔽2号信号,有解除屏蔽2号信号的例子。...,程序到20秒时退出: 四、总结 31个信号中并不是所有信号都可以被屏蔽掉,9号信号(SIGKILL)和19号信号(SIGSTOP)是无法被屏蔽掉的。

11110

如何屏蔽SIGPIPE信号

#include #include //默认读写一个关闭的socket会触发sigpipe信号信号的默认操作是关闭进程 有时候这明显是我们不想要的...//所以此时我们需要重新设置sigpipe的信号回调操作函数 比如忽略操作等 使得我们可以防止调用它的默认操作 //信号的处理是异步操作 也就是说 在这一条语句以后继续往下执行中如果碰到信号依旧会调用信号的回调处理函数...//处理sigpipe信号 void handle_for_sigpipe() { struct sigaction sa; //信号处理结构体 memset(&sa, '\...启动另一个Linux终端并执行killall -SIGPIPE sigpipe,可以发现sigpipe程序的默认操作关闭进程并未执行。...再次启动另一个Linux终端并执行killall -SIGPIPE sigpipe,可以发现sigpipe程序退出了。

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

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

    Linux是这样实现的:常规信号在递达之前产生多次只计一次,而实时信号在递达之前产生多次可以依次放在一个队列里 3.3 sigset_t 从上图来看,每个信号只有一个bit的未决标志,非0即1,不记录该信号产生了多少次...“有效”和“无效”的含义是该信号是否处于未决状态 阻塞信号集也叫做当前进程的信号屏蔽字(Signal Mask),这里的“屏蔽”应该理解为阻塞而不是忽略 3.4 信号集操作函数 sigset_t类型对于每种信号用一个...如果set是非空指针,则更改进程的信号屏蔽字,参数how指示如何更改。如果oset和set都是非空指针,则先将原来的信号 屏蔽字备份到oset里,然后根据set和how参数更改信号屏蔽字。...显然,这也是一个回调函数,不是被main函数调用,而是被系统调用 当某个信号的处理函数被调用时,内核自动将当前信号加入进程的信号屏蔽字,当信号处理函数返回时自动恢复原来的信号屏蔽字,这样就保证了在处理某个信号时...如果在调用信号处理函数时,除了当前信号被自动屏蔽之外,还希望自动屏蔽另外一些信号,则用sa_mask字段说明这些需要额外屏蔽信号,当信号处理函数返回时自动恢复原来的信号屏蔽字 void Print(sigset_t

    15610

    Linux信号

    a process,my pid is:"<<getpid()<<endl; sleep(1); } return 0; } ---- 那如果我们使用signal将所有的信号都捕捉起来...,那岂不是说明只要一个进程把所有的信号都捕捉起来,那这个进程就可以在系统中肆意妄为?...操作系统不会允许某个进程将所有的信号都捕捉,至少kill -9信号是无法被捕捉的,因为操作系统不相信任何人,它必须要留一手来保护自身的安全 ---- 2.使用kill指令(可以向任意进程发送信号) kill...如果set是非空指针,则更改进程的信号屏蔽字,参数how指示如何更改。 如果oset和set都是非空指针,则先将原来的信号 屏蔽字备份到oset里,然后根据set和how参数更改信号屏蔽字。...cout << "恢复对信号屏蔽,不屏蔽任何信号\n"; } } return 0; } 但是由于我对该信号做自定义捕捉了,所以2号信号无法终止该进程了。

    20530

    Linux信号】四:SIGCHLD信号

    SIGCHLD产生的条件 实际上,在子进程结束的时候,会产生一个SIGCHLD信号信号描述如下,根据man手册可以知道,子进程结束运行,其父进程会收到SIGCHLD信号,该信号的默认处理动作是忽略。...printf("recycle process: %d\n", pid); } } int main(void) { int i = 0; pid_t pid; /*先屏蔽...mact.sa_mask); mact.sa_handler = mcatch; sigaction(SIGCHLD, &mact, NULL); /*恢复原来的屏蔽设置...可能 产生僵尸进程,使用mcatch2会更好*/ } return 0; } 根据这个例子,我们可以得到下面几点注意事项 子进程继承了父进程的信号屏蔽字和信号处理动作...,分析慢速系统调用,慢速系统调用被中断的相关行为,实际上就是pause的行为,比 如read 慢速系统调用被中断的相关行为,实际上就是pause的行为,比 如read 想中断pause,首先信号不能被屏蔽

    11310

    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进程信号信号产生】的全部内容了

    30610

    Linux进程信号信号保存】

    表 通过信号集称为 阻塞信号集或信号屏蔽字(屏蔽表示阻塞),pending 表 通过信号集中称为 未决信号集 如何根据 sigset_t 位图结构进行比特位的操作?...,相当于 mask &= (~set) SIG_SETMASK 设置当前进程的 block 表为 set 信号集中的 block 表,相当于 mask = set 参数2:就是一个信号集,主要从此信号集中获取屏蔽信号信息...sigemptyset(&oset); // 阻塞2号信号 sigaddset(&set, 2); //记录 2 号信号 // 设置当前进程的 屏蔽信号集 sigprocmask...注意: 针对信号的 增删改查 都需要通过 系统调用 来完成,不能擅自使用位运算 sigprocmask、sigpending 这两个函数的参数都是 信号集,前者是 屏蔽信号集,后者是 未决信号集 在对...---- 总结 以上就是本次关于 Linux进程信号信号保存】的全部内容了,在本文中,我们首先再一次对信号有了较深的理解,知道了在内核中存在三张表记录信号的处理流程,然后我们学习了信号集的操作函数,

    20020

    Linux 信号

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

    4.8K20

    Linux进程信号信号处理】

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

    24010

    Linux信号】三:信号的捕捉

    signal() varies across Unix versions, and has also varied historically across different versions of Linux...注册一个信号捕捉函数,该函数由ANSI定义,由于历史原因在不同版本的Unix和不同版本的Linux中可能有不同的行为。因此应该尽量避免使用它,取而代之使用sigaction函数。...sa_mask 调用信号处理函数时,所要屏蔽信号集合(信号屏蔽字)。注意:仅在处理函数被调用期间屏蔽生效,是临时性设置。实际上就是执行捕捉函数期间临时屏蔽信号集。...,再把信号屏蔽字恢复为M。...在调用m_catch的时候,该信号会被屏蔽,m_catch执行完就会恢复原来的屏蔽信号,该信号解除屏蔽*/ mact.sa_handler = m_catch; sigaction

    13810

    Linux信号概念与信号产生

    我们可以查看Linux中的信号列表,指令为: kill -l 其中我们发现,0号、32号和33号信号是没有的。...其实键盘上的按键是有分类的,有的是用来输入的,有的是用来控制的,比如 ctrl + c、z等,所以操作系统在拷贝数据的时候会进行判断,输入的是数据还是控制,如果是控制,会转化为相应的信号发送给进程!...如下: 如果我们把19号信号捕捉呢?如下: 如上图,它没有捕捉到19号信号;所以我们得出,不是所有的信号都是可以被 signal 捕捉的。...所以键盘组合键发送信号常见的组合就是以下三个: ctrl + c ctrl + \ ctrl + z 我们从上面知道,不是所有的信号都是可以被 signal 捕捉的,所以我们可以尝试将所有信号都捕捉一下...所以进程一旦出异常了,不一定会退出,但是一旦异常退出了,一定是执行了信号对应的异常处理方法。 (2)理解本质 下面我们进一步理解为什么除0错误和野指针会让进程崩溃。

    18810

    Linux如何屏蔽国外IP-宝塔如何屏蔽国外IP-appnode如何屏蔽国外IP

    正文 对NGINX折腾发现很难,于是想到奇葩的解决方法 我直接屏蔽国外吧,这样就不会被打到500(手动滑稽) 然后百度找了很多文章,我靠这些ip段好老,而且很多,直接白名单国内吧,然后找到一个 https...://github.com/17mon/china_ip_list  好像是每月更新一次还不错 因为这篇文章主要还是说Linux如何屏蔽国外上面这个 可以用控制面板的黑名单直接拉黑 appnode 可以...宝塔没看见可以直接屏蔽或者白名单某个ip段或者其他,可以屏蔽指定ip ?...可以快速的让我们屏蔽某个 IP 段。这里分享一个屏蔽指定国家的 IP 访问的方法和一个屏蔽国外 IP 访问(仅允许国内 IP 访问)的方法,当我们遇到 CC 攻击,可以尝试选择和使用能有所缓解。...ip对网站是有一定好处,如果你的网站是有一定国外用户,那就不要去屏蔽,一般情况,是不会有国外用户,国外的ip一般都是对你网站进行漏洞扫描等其他操作,屏蔽后对网站也有一定好处。

    25.8K33

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

    阻塞信号集:也叫信号屏蔽字,将某些信号加入集合,对他们设置屏蔽,当屏蔽某个信号后,再收到该信号,该信号的处理将推后(解除屏蔽后)。...信号产生后由于某些原因主要是阻塞不能抵达,这类信号的集合称之为未决信号集。在屏蔽解除前,信号一直处于未决状态。...3.6 信号四要素 每个信号必须要有的四个要素: 编号 名称 事件 默认处理动作,信号的默认动作主要有: Term:终止进程 Ign: 忽略信号 ,默认即时对该种信号忽略操作 Core:终止进程,生成Core...因此有些信号出现在Unix系统内,也出现在Linux中,而有的信号出现在FreeBSD或 Mac OS 中却没有出现在Linux下。这里我们只研究Linux系统中的信号。...这里特别强调了SIGKILL 和SIGSTOP信号,不允许忽略和捕捉,只能执行默认动作。甚至不能将其设置为阻塞。另外需清楚,只有每个信号对应的事件发生了,该信号才会被递送(但不一定递达)。

    8810

    Linux信号基础

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

    2.5K50

    Linux】进程信号

    ,对于2号和3号信号处理动作默认为终止进程 2.系统调用 除了键盘向前台进程发送信号之外,前台进程会影响shell,linux规定跟shell交互的时候只允许有一个前台进程,默认情况下bash也是一个进程...——当前信号正在被捕捉,系统会自动将当前信号加入到进程的信号屏蔽字,在block表中自动将2号信号屏蔽。...而当信号完成捕捉动作,系统又会自动解除对该信号屏蔽 一般一个信号被解除屏蔽的时候,会自动进行递达当前屏蔽信号,如果该信号已经被pending的话,没有就不做任何动作 进程处理信号的原则是串行的处理同类的信号...,不允许递归式处理 小细节:屏蔽2号的同时还想屏蔽3号,只需要加上: sigemptyset(&act.sa_mask);//当我们正在处理某一种信号的时候,我们也想顺便屏蔽其他信号,就可以添加到这个sa_mask...),handler_t handler[32]={0},这个就是函数指针数组,这个数组在内核中有指针指向它,这个数组称为当前进程匹配的信号递达的所有方法,数组是有下标的,数组的位置(下标)代表信号的编号

    18110

    Linux信号处理

    外部信号:终端 Ctrl-C 产生 SGINT 信号,定时器到期产生SIGALRM等。 显式请求:kill函数允许进程发送任何信号给其他进程或进程组。 目前 Linux 支持64种信号。...信号分为非实时信号(不可靠信号)和实时信号(可靠信号)两种类型,对应于 Linux信号值为 1-31 和 34-64。 信号是异步的,一个进程不必通过任何操作来等待信号的到达。...信号实现原理 接下来我们分析一下Linux信号处理机制的实现原理。...成员 blocked 表示被屏蔽的信息,每个位代表一个被屏蔽信号。...为了尽快让信号得到处理,Linux信号处理过程放置在进程从内核态返回到用户态前,也就是在 ret_from_sys_call 处: // arch/i386/kernel/entry.S ENTRY

    5.9K40

    Linux 信号(Signal)

    很多人经常把它们搞混,这篇文章会让你了解 Linux信号机制,以及一些常见信号的作用。 什么是信号 信号(Signal)是 Linux 进程收到的一个通知。...当进程收到一个信号时,该进程会中断其执行,并执行收到信号对应的处理程序。 信号机制作为 Linux 进程间通信的一种方法。Linux 进程间通信常用的方法还有管道、消息、共享内存等。...信号处理 一旦有信号产生,进程对它的处理都有下面三个选择。 执行缺省操作(Default)。Linux 为每个信号都定义了一个缺省的行为。...task_struct->sighand 和 task_struct->signal 是线程组内共享,而 task_struct->pending 是线程私有的。...task_struct->pending 内包含了一个链表,保存了本线程所有的待处理信号

    1K10
    领券