linux中的 【信号】 (待续)

信号的产生方式:

1、键盘输入

如 Ctrl+C 表示产生一个SIGINT信号

2、异常产生信号

如 程序执行到 2/0 这种情况、 管道的读段已经关闭而写端仍向管道中写入数据这种情况 等...

3、通过命令向指定进程发送信号

对信号的处理方式:

1、忽略

2、执行默认处理(通常为终止程序)

3、执行自定义动作 (信号的捕捉)

举个例子。

下面这段程序,从0开始,每隔一秒输出一个不断增长的数值

执行:

显然 它是一个死循环,将会一直执行下去

用信号中断它,可以直接用Ctrl + C

这样内核会对该进程发送一个 SIGINT 信号,结束当前进程:

此外,执行程序后 另外打开一个终端

(其实在执行命令的语句后面加上 & 就可以让当前进程在后台运行,也就不需要另外打开中断了,这里这样做是为了更直观一些)

先用 ps aux 命令查找到当前进程的 PID

然后用 killl -l 命令查看所有信号:

这里能够发现, Ctrl+C快捷键发送的 SIGINT 信号对应的2,

而我当前进程的PID 为:20262

那么,执行命令  : kill -2 20262 或者 kill -SIGINT 20262

发现死循环的进程终止了

接下来介绍几个信号集操作函数:

int sigemptyset(sigset_t *set);
int sigfillset(sigset_t *set);
int sigaddset(sigset_t *set, int signo);
int sigdelset(sigset_t *set, int signo);
int sigismember(const sigset_t *set, int signo); 

int sigprocmask(int how, const sigset_t *set, sigset_t *oset); 
int sigpending(sigset_t *set);

第一个函数:

sigemptyset 用来初始化 set 指向的 信号集,使所有信号对应的bit清零,表示该信号集不包含任何有效信号

成功返回0,出错返回 -1

第二个函数:

sigfillset 同样用来初始化,不过跟上面那个 sigemptyset 作用相反,它表示该信号集包括系统支持的所有信号

成功返回0,出错返回 -1

在使用 sigset_t 类型变量之前,必须调用上述两个初始化阐述中的任意一个

第三个函数:

sigaddset 的作用是向指定信号集 set 中添加 有效信号

成功返回0,出错返回 -1

第四个函数:

sigdelset 的作用是在指定信号集 set 中 删除有效信号

成功返回0,出错返回 -1

第五个函数:

sigismember 用来判断指定的信号是否在指定信号集中

若存在,返回1;  若不存在,返回0;  若出错,返回-1

第六个函数:

sigprocmask 可以读取或更改进程的信号屏蔽字
int sigprocmask(int how, const sigset_t *set, sigset_t *oset);

成功返回0,失败返回-1

其中第一个参数 how表示处理方式,有以下三种:

·SIG_BLOCK :

set包含了我们希望添加到当前信号屏蔽字的信号  //相当于mask = mask | set

·SIG_UNBLOCK :

set包含了我们希望从当前信号屏蔽字中解除阻塞的信号  //相当于 mask = mask | ~set

·SIG_SETMASK :

设置当前信号屏蔽字为set所指向的值    //相当于 mask = set

第七个函数:

sigpending 读取当前进程的未决信号集,通过set参数传出

成功返回0,失败返回-1

时间: 2024-08-24 14:06:16

linux中的 【信号】 (待续)的相关文章

辛星浅析Linux中的信号

要说Linux中的信号,不得不先提一下中断这个概念.中断是系统中对于异步事件的响应,也就是说某个进程可以在代码执行的过程中被打断了,它先去执行一段异常处理程序.中断可以分为硬件中断,也就是外部中断,它是由外部设备通过硬件请求的方式产生的中断.而软件中断,也就是内部中断,它是由CPU运行程序的一些错误或者执行内部程序调用的时候引起的一种中断. 在CPU的层面去看中断,是这样的一个步骤: ①中断源发出中断信号  ②CPU判断是屏蔽该中断以及现场保护③CPU查询中断向量表,找到相应服务程序的入口地址,

浅谈Linux中的信号机制(二)

首先谢谢 @小尧弟 这位朋友对我昨天夜里写的一篇<浅谈Linux中的信号机制(一)>的指正,之前的题目我用的“浅析”一词,给人一种要剖析内核的感觉.本人自知功力不够,尚且不能对着Linux内核源码评头论足.以后的路还很长,我还是一步一个脚印的慢慢走着吧,Linux内核这座山,我才刚刚抵达山脚下. 好了,言归正传,我接着昨天写下去.如有错误还请各位看官指正,先此谢过. 上篇末尾,我们看到了这样的现象:send进程总共发送了500次SIGINT信号给rcv进程,但是实际过程中rcv只接受/处理了1

Linux 中常见信号介绍

http://blog.csdn.net/eager7/article/details/8290937 我们运行如下命令,可看到Linux支持的信号列表: $ kill -l1) SIGHUP 2) SIGINT 3) SIGQUIT 4) SIGILL 5) SIGTRAP 6) SIGABRT 7) SIGBUS 8) SIGFPE 9) SIGKILL 10) SIGUSR1 11) SIGSEGV 12) SIGUSR213) SIGPIPE 14) SIGALRM 15) SIGTER

浅析Linux中的信号机制(一)

有好些日子没有写博客了,自己想想还是不要荒废了时间,写点儿东西记录自己的成长还是百利无一害的.今天是9月17号,暑假在某家游戏公司实习了一段时间,做的事情是在Windows上用c++写一些游戏英雄技能的逻辑实现.虽然时间不算长,但是也算学了一点东西,对团队项目开发流程也有了一个直观的感受,项目里c++11新特性也有用到不少,特别是lambda表达式,STL的一些容器和算法也终于有了可以实践的地方.由于自己比较喜欢Linux C,也就没有做留下的打算,现在回到了学校,好好复习一段时间,准备一下校招

细说Linux中的信号(signal )

在细说信号之前我们先来了解下什么是信号.信号(signal)是一种软件中断,它提供了一种处理异步事件的方法,也是进程间惟一的异步通信方式.在Linux系统中,根据POSIX标准扩展以后的信号机制,不仅可以用来通知某种程序发生了什么事件,还可以给进程传递数据. 信号的种类有很多,我们可以通过kill -l命令察看系统定义的信号列表: 可以看到一共有62个信号.1-31号为普通信号:34-64号为实时信号.(博主这次只讨论普通信号.) 接下来我们来细说信号的产生.阻塞和捕捉. >>信号的产生: 通

Linux内核中的信号机制--一个简单的例子【转】

本文转载自:http://blog.csdn.net/ce123_zhouwei/article/details/8562958 Linux内核中的信号机制--一个简单的例子 Author:ce123(http://blog.csdn.NET/ce123) 信号机制是类UNIX系统中的一种重要的进程间通信手段之一.我们经常使用信号来向一个进程发送一个简短的消息.例如:假设我们启动一个进程通过socket读取远程主机发送过来的网络数据包,此时由于网络因素当前主机还没有收到相应的数据,当前进程被设置

老男孩教育每日一题-第69天-shell脚本知识点:linux系统脚本中trap信号都有哪些,如何进行使用?

题目 shell脚本知识点:linux系统脚本中trap信号都有哪些,如何进行使用? 参考答案: [trap信号命令说明] trap命令用于指定在接收到信号后将要采取的行动,trap命令的一种常见用途是在脚本程序被中断时完成清理工作.历史上,shell总是用数字来代表信号,而新的脚本程序应该使用信号的名字,它们保存在用#include命令包含进来的signal.h头文件中,在使用信号名时需要省略SIG前缀.可以在命令提示符下输入命令trap -l来查看信号编号及其关联的名称. [trap信号命令

linux中的两个非常重要的信号:SIGALRM信号和SIGCHID信号

在进行阻塞式系统调用时,为避免进程陷入无限期的等待,可以为这些阻塞式系统调用设置定时器.Linux提供了alarm系统调用和SIGALRM信号实现这个功能. 要使用定时器,首先要安装SIGALRM信号.如果不安装SIGALRM信号,则进程收到SIGALRM信号后,缺省的动作就是终止当前进程.SIGALRM信号安装成功后,在什么情况下进程会收到该信号呢?这就要依赖于Linux提供的定时器功能.在Linux系统下,每个进程都有惟一的一个定时器,该定时器提供了以秒为单位的定时功能.在定时器设置的超时时

Linux中的僵尸进程和孤儿进程

在UNIX里,除了进程0(即PID=0的交换进程,Swapper Process)以外的所有进程都是由其他进程使用系统调用fork创建的,这里调用fork创建新进程的进程即为父进程,而相对应的为其创建出的进程则为子进程,因而除了进程0以外的进程都只有一个父进程,但一个进程可以有多个子进程.        操作系统内核以进程标识符(Process Identifier,即PID)来识别进程.进程0是系统引导时创建的一个特殊进程,在其调用fork创建出一个子进程(即PID=1的进程1,又称init)

linux中的signal机制(转)

信号是Linux编程中非常重要的部分,本文将详细介绍信号机制的基本概念.Linux对信号机制的大致实现方法.如何使用信号,以及有关信号的几个系统调用. 信号机制是进程之间相互传递消息的一种方法,信号全称为软中断信号,也有人称作软中断.从它的命名可以看出,它的实质和使用很象中断.所以,信号可以说是进程控制的一部分. 一.信号的基本概念 本节先介绍信号的一些基本概念,然后给出一些基本的信号类型和信号对应的事件.基本概念对于理解和使用信号,对于理解信号机制都特别重要.下面就来看看什么是信号. 1.基本