信号的产生以及处理方式(一)

/*************************************************************************************************************/

为了理解信号,先从我们最熟悉的场景说起:

1.用户输入命令,在Shell下启动一个前台进程。

2.用户按下Ctrl-C,这个键盘输入产生一个硬件中断。

3.假设CPU当前正在运行这个进程的代码,则该进程的用户空间代码暂停运行,CPU从用户态
切换到内核态处理硬件中断。

4.终端驱动程序将Ctrl-C解释成一个SIGINT(#2)信号,记在该进程的PCB中(也能够说发送了一
个SIGINT信号给该进程)。

5.当某个时刻要从内核返回到该进程的用户空间代码继续运行之前,首先处理PCB中记录的信号,发现有一个SIGINT信号待处理,而这个信号的默认处理动作是终止进程,所以直接终止进程而不再返回它的用户空间代码运行。

前台进程:影响命令行工作的进程

一个命令 后面加个&能够放到后台执行,这样Shell不必等待进程结束就能够接受新的命令,启动新的进程。Shell能够同一时候执行一个前台进程和随意多个后台进程,仅仅有前台进程才干接到像Ctrl-C这样的控
制键产生的信号。

信号相对于进程的控制流 程来说是异步的。也就是说该进 程的用户空间代码执行到不论什么地方都有可能收到信号而终止。

/*************************************************************************************************************/

一、信号的产生方式:

(1)通过终端按键产生信号(即组合键)。但仅仅能发给前台进程。

(2)硬件异常产生信号,调用系统函数向进程发信号,这些条件由硬件检測到并通知内核,然后内核向当前进程发送适当的

信号。

(硬件异常比方:当前进程运行了除以0的指令,CPU的运算单元会产生异常,内核将这个异常解释
为SIGFPE信号发

送给进程。 再比方:当前进程訪问了非法内存地址,,MMU会产生异常,内核
将这个异常解释为
SIGSEGV信号发送给

进程)

(3)由软件条件产生信号. 如
kill命令,kill 函数。raise 函数(自己给自己发送信号)

int kill(pid_t pid,int sig);

返回值:成功-->ret==0。失败返回-1。error 被设置。(附:mykill
的实现见最后...六...)

int raise(int sig);  //自己给自己发信号

返回值:成功-->ret==0,  失败返回非零。

/*************************************************************************************************************/

二、信号的处理方式:

(1)忽略此信号。

(2)运行该信号的默认处理动作。

(3)自己定义该信号的处理动作(信号捕捉)。

/*************************************************************************************************************/

三、SIGQUIT与Core Dump

SIGQUIT的默认处理动作是终止进程而且Core
Dump,它的组合键为:Ctrl+\

Core Dump:当一个进程要异常终止时,能够选择把进程的用户空间内存数据所有
保存到磁盘上,文件名称一般是core.

core文件的作用:进程异常终止一般是由于有Bug,比方非法内存訪问导致段错误,事后能够用调试器检查core文件以

查清错误原因,这叫做Post-mortem
Debug.

默认是不同意产生core文件的(它的size=0),由于core文件里可能包括用户password等敏感信息,不安全。

在开发调试阶段能够用ulimit命令改变这个限制,同意产生core文件。指令:#ulimit
-c size

(1)改变 core 文件的大小

(2)以下的代码在执行时会触发段错误。并生成 core 文件。利用该文件进行调试就会定位到错误。

#./a.out 执行 a.out 程序(在执行时会触发段错误,并生成 core 文件:core.id)(id为进程号)

/*************************************************************************************************************/

四、abort函数使当前进程接收到SIGABRT信号而异常终止。

#include <stdlib.h>

void abort(void);

就像exit函数一样,abort函数总是会成功的,所以没有返回值。

/*************************************************************************************************************/

五、alarm函数 和SIGALRM信号。

#include <unistd.h>

unsigned int alarm(unsigned int seconds);

调用alarm函数能够设定一个闹钟,也就是告诉内核在seconds秒之后给当前进程发SIGALRM信号,该信号的默认处理动作是终止当前进程。

这个函数的返回值是0或者是曾经(它的前一次)设定的闹钟时间还余下
的秒数

以下程序的功能:

(1)先设置闹钟时间为3s;

(2)再sleep(1)后。又一次设置闹钟时间为 1s。则alarm函数的返回值为2s;

(3)count一直添加。1s后。闹钟时间到,向进程发送终止信号,进程终止。

/*************************************************************************************************************/

六、自己实现 kill 函数 mykill

把a.out 程序执行起来后,在还有一个终端上用  #./mykill  pid signum 终止该程序

函数main.c的代码:

函数 mykill的实现:

/*************************************************************************************************************/

时间: 2024-08-12 06:18:31

信号的产生以及处理方式(一)的相关文章

第81课 信号与槽的连接方式

1. QObject::connect函数 bool connect(const QObject* sender, //发送者 const char* signal, //信号 const QObject* receiver, //接收者 const char* method, //槽函数 Qt::ConnectionType type = Qt::AutoConnection);//连接方式 2. 深入信号与槽的连接方式 (1)Qt::DirectConnection(直接连接,立即调用):直

进程间通信--信号(进程间通信唯一的异步方式)

一.信号的介绍 信号是在软件层次上对中断机制的一种模拟,是一种异步通信方式. 信号可以直接进行用户空间进程和内核进程之间的交互,内核进程也可以利用它来通知用户空间进程发生了那些系统事件. 如果该进程当前并未处于执行态,则该信号就由内核保存起来,直到该进程恢复执行再传递个它:如果一个信号被进程设置为阻塞,则该信号的传递被延迟,直到其阻塞取消时才被传递给进程. 二.linux操作系统支持的信号 A. kill  -l B.常用信号的含义 三.信号的产生 A.用户在终端按下某些键时,终端驱动程序会发送

qt多线程信号槽传输方式

//简单介绍一下QT信号与槽的连接方式:    //Qt::AutoConnection表示系统自动选择相应的连接方式,如果信号与槽在同一线程,就采用Qt::DirectConnection, //如果信号与槽不在同一线程,将采用Qt::QueuedConnection的连接方式.     //Qt::DirectConnection表示一旦信号产生,立即执行槽函数.     //Qt::QueuedConnection表示信号产生后,将发送Event给你的receiver所在的线程,postE

Linux高性能server编程——信号及应用

?? 信号 信号是由用户.系统或者进程发送给目标进程的信息.以通知目标进程某个状态的改变或系统异常. Linux信号可由例如以下条件产生: 对于前台进程.用户能够通过输入特殊的终端字符来给它发送信号.比方输入Ctrl+C一般会给进程发送一个终端信号. 2.系统异常 系统状态变化 执行kill命令或调用kill函数 Linux信号概述 发送信号 Linux下,一个进程给其它进程发送信号的API是kill函数.其定义例如以下: #include <sys/types.h> #include <

Linux学习笔记(10)-信号

所谓信号(singal),在我的理解来说,其实和单片机开发中的中断差不多,但是它并非是由系统硬件所提供的,而是软件操作系统的支持的一种提醒机制. 收到信号之后的处理方法,一般由三种: (1)第一种是类似于中断处理函数,对于要处理的信号,进程指定某个处理函数. (2)第二种是忽略某个信号,不做任何处理. (3)第三种是使用系统默认的处理方式,比如Ctrl+c的终止当前进程. Linux中常用的信号有30多种,每个信号都以关键字SIG开头,比如异常终止的信号,名叫SIGABRT. 在头文件<Sing

LINUX信号

一.产生信号的三种方式: 1.由键盘(终端按键)产生,比如在shell下启动一个前台进程(控制台下的进程),按Ctrl^C(只能发给前台进程)会产生一个硬件中断,若CPU正在执行此进程代码,则该进程用户空间代码暂停执行,CPU从用户态切换到内核态处理中断,如果不是自定义信号处理函数,一般默认的处理动作为终止进程,所以在内核态直接终止进程而不返回用户区. 2.由系统函数发送信号,可用kill命令给某个指定进程发送信号,它是调用kill函数实现的. 模型:kill -发送几号信号 给哪个进程 例:k

细说linux IPC(八):信号(下)

[版权声明:尊重原创,转载请保留出处:blog.csdn.net/shallnet 或 .../gentleliu,文章仅供学习交流,请勿用于商业用途] 上一节的说了使用kill函数来发送信号和使用signal函数来安装信号处理函数,这一节我们使用另外一种方式来实现安装信号处理和发送信号. 早期UNIX只支持SIGRTMIN之前的不可靠信号,后来增加了SIGRTMIN到SIGRTMAX的可靠信号,同时也增加了信号发送和安装的方式,使用sigqueue()函数可以发送信号,使用sigaction函

Linux系统开发6 信号

[本文谢绝转载,原文来自http://990487026.blog.51cto.com] <大纲> Linux系统开发6 信号 linux系统有64种信号 signal man文档 终端按键信号 ctrl +c SIGIN ctrl +z SIGTSTP ctrl +\ SIGQUIT 硬件产生信号 浮点数例外信号  访问非法内存 kill()函数 信号与权限 kill()函数的pid 与返回值 信号产生原因 raise() 信号 abort() 信号 alarm() 信号 收到信号的默认操作

浅析 Linux/UNIX 信号机制

附件:linux man手册关于signal的介绍 信号常常被称为“软中断”,和“中断”类似,用来通知程序发生异步事件.对信号的处理一般来说有三种方式:忽略,终止进程以及使用信号处理函数.信号处理函数的方式是从一处执行流断开,转而去运行另外的一处代码(信号处理),当处理函数返回时,继续从断开的地方继续执行. 1.安装信号处理函数 在系统编程的层面上与信号的处理关系最直接相关的函数有两个,他们用来安装信号处理函数: sighandler_t signal(int signum, sighandle