`
luckyclouds
  • 浏览: 108951 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

Linux 信号signal处理机制 一

阅读更多
信号是Linux编程中非常重要的部分,本文将详细介绍信号机制的基本概念、Linux对信号机制的大致实现方法、如何使用信号,以及有关信号的几个系统调用。

        信号机制是进程之间相互传递消息的一种方法,信号全称为软中断信号,也有人称作软中断。从它的命名可以看出,它的实质和使用很象中断。所以,信号可以说是进程控制的一部分。

        一、信号的基本概念

        本节先介绍信号的一些基本概念,然后给出一些基本的信号类型和信号对应的事件。基本概念对于理解和使用信号,对于理解信号机制都特别重要。下面就来看看什么是信号。

        1、基本概念

        软中断信号(signal,又简称为信号)用来通知进程发生了异步事件。进程之间可以互相通过系统调用kill发送软中断信号。内核也可以因为内部事件而给进程发送信号,通知进程发生了某个事件。注意,信号只是用来通知某进程发生了什么事件,并不给该进程传递任何数据。

        收 到信号的进程对各种信号有不同的处理方法。处理方法可以分为三类:第一种是类似中断的处理程序,对于需要处理的信号,进程可以指定处理函数,由该函数来处 理。第二种方法是,忽略某个信号,对该信号不做任何处理,就象未发生过一样。第三种方法是,对该信号的处理保留系统的默认值,这种缺省操作,对大部分的信 号的缺省操作是使得进程终止。进程通过系统调用signal来指定进程对某个信号的处理行为。

        在进程表的表项中有一个软中断信号域,该域中每一位对应一个信号,当有信号发送给进程时,对应位置位。由此可以看出,进程对不同的信号可以同时保留,但对于同一个信号,进程并不知道在处理之前来过多少个。

        2、信号的类型

        发出信号的原因很多,这里按发出信号的原因简单分类,以了解各种信号:

        (1) 与进程终止相关的信号。当进程退出,或者子进程终止时,发出这类信号。
        (2) 与进程例外事件相关的信号。如进程越界,或企图写一个只读的内存区域(如程序正文区),或执行一个特权指令及其他各种硬件错误。
        (3) 与在系统调用期间遇到不可恢复条件相关的信号。如执行系统调用exec时,原有资源已经释放,而目前系统资源又已经耗尽。
        (4) 与执行系统调用时遇到非预测错误条件相关的信号。如执行一个并不存在的系统调用。
        (5) 在用户态下的进程发出的信号。如进程调用系统调用kill向其他进程发送信号。
        (6) 与终端交互相关的信号。如用户关闭一个终端,或按下break键等情况。
        (7) 跟踪进程执行的信号。

        Linux支持的信号列表如下。很多信号是与机器的体系结构相关的,首先列出的是POSIX.1中列出的信号:

        信号 值 处理动作 发出信号的原因
        ----------------------------------------------------------------------
        SIGHUP 1 A 终端挂起或者控制进程终止
        SIGINT 2 A 键盘中断(如break键被按下)
        SIGQUIT 3 C 键盘的退出键被按下
        SIGILL 4 C 非法指令
        SIGABRT 6 C 由abort(3)发出的退出指令
        SIGFPE 8 C 浮点异常
        SIGKILL 9 AEF Kill信号
        SIGSEGV 11 C 无效的内存引用
        SIGPIPE 13 A 管道破裂: 写一个没有读端口的管道
        SIGALRM 14 A 由alarm(2)发出的信号
        SIGTERM 15 A 终止信号
        SIGUSR1 30,10,16 A 用户自定义信号1
        SIGUSR2 31,12,17 A 用户自定义信号2
        SIGCHLD 20,17,18 B 子进程结束信号
        SIGCONT 19,18,25 进程继续(曾被停止的进程)
        SIGSTOP 17,19,23 DEF 终止进程
        SIGTSTP 18,20,24 D 控制终端(tty)上按下停止键
        SIGTTIN 21,21,26 D 后台进程企图从控制终端读
        SIGTTOU 22,22,27 D 后台进程企图从控制终端写

        下面的信号没在POSIX.1中列出,而在SUSv2列出

        信号 值 处理动作 发出信号的原因
        --------------------------------------------------------------------
        SIGBUS 10,7,10 C 总线错误(错误的内存访问)
        SIGPOLL A Sys V定义的Pollable事件,与SIGIO同义
        SIGPROF 27,27,29 A Profiling定时器到
        SIGSYS 12,-,12 C 无效的系统调用 (SVID)
        SIGTRAP 5 C 跟踪/断点捕获
        SIGURG 16,23,21 B Socket出现紧急条件(4.2 BSD)
        SIGVTALRM 26,26,28 A 实际时间报警时钟信号(4.2 BSD)
        SIGXCPU 24,24,30 C 超出设定的CPU时间限制(4.2 BSD)
        SIGXFSZ 25,25,31 C 超出设定的文件大小限制(4.2 BSD)

        (对于SIGSYS,SIGXCPU,SIGXFSZ,以及某些机器体系结构下的SIGBUS,Linux缺省的动作是A (terminate),SUSv2 是C (terminate and dump core))。

        下面是其它的一些信号

        信号 值 处理动作 发出信号的原因
        ----------------------------------------------------------------------
        SIGIOT 6 C IO捕获指令,与SIGABRT同义
        SIGEMT 7,-,7
        SIGSTKFLT -,16,- A 协处理器堆栈错误
        SIGIO 23,29,22 A 某I/O操作现在可以进行了(4.2 BSD)
        SIGCLD -,-,18 A 与SIGCHLD同义
        SIGPWR 29,30,19 A 电源故障(System V)
        SIGINFO 29,-,- A 与SIGPWR同义
        SIGLOST -,-,- A 文件锁丢失
        SIGWINCH 28,28,20 B 窗口大小改变(4.3 BSD, Sun)
        SIGUNUSED -,31,- A 未使用的信号(will be SIGSYS)

        (在这里,- 表示信号没有实现;有三个值给出的含义为,第一个值通常在Alpha和Sparc上有效,中间的值对应i386和ppc以及sh,最后一个值对应mips。信号29在Alpha上为SIGINFO / SIGPWR ,在Sparc上为SIGLOST。)

        处理动作一项中的字母含义如下
        A 缺省的动作是终止进程
        B 缺省的动作是忽略此信号
        C 缺省的动作是终止进程并进行内核映像转储(dump core)
        D 缺省的动作是停止进程
        E 信号不能被捕获
        F 信号不能被忽略

        上 面介绍的信号是常见系统所支持的。以表格的形式介绍了各种信号的名称、作用及其在默认情况下的处理动作。各种默认处理动作的含义是:终止程序是指进程退 出;忽略该信号是将该信号丢弃,不做处理;停止程序是指程序挂起,进入停止状况以后还能重新进行下去,一般是在调试的过程中(例如ptrace系统调 用);内核映像转储是指将进程数据在内存的映像和进程在内核结构中的部分内容以一定格式转储到文件系统,并且进程退出执行,这样做的好处是为程序员提 供了方便,使得他们可以得到进程当时执行时的数据值,允许他们确定转储的原因,并且可以调试他们的程序。

        注意 信号SIGKILL和SIGSTOP既不能被捕捉,也不能被忽略。信号SIGIOT与SIGABRT是一个信号。可以看出,同一个信号在不同的系统中值可能不一样,所以建议最好使用为信号定义的名字,而不要直接使用信号的值。
分享到:
评论

相关推荐

    Linux 信号signal处理机制

    Linux 信号signal处理机制,Linux 信号signal处理机制

    Linux 信号signal处理机制.docx

    Linux 信号signal处理机制.docx

    Linux信号signal处理机制[参考].pdf

    Linux信号signal处理机制[参考].pdf

    linux信号机制和signal

    信号是Linux编程中非常重要部分本文将详细介绍信号机制基本概念、Linux对信号机制大致实现思路方法、如 何使用信号以及有关信号几个系统

    Linux信号(signal)机制.rar

    Linux,系统,内幕,编程

    linux进程间通信——信号机制

    对linux信号机制的详细阐述,包括signal,sigaction等函数的用法,并配以实例,通俗易懂,适合初学者阅读。。。

    3操作系统实验.doc

    实验一:信号机制 实验目的 1、了解什么是信号 2、熟悉LINUX系统中进程之间软中断通信的基本原理 实验内容 1、编写程序:用fork( )创建两个子进程,再用系统调用signal( )让父进程捕捉键盘上来的中断信号(即按^c键...

    信号量机制实验

    编写一段程序,使用系统调用fork( )创建两个子进程,再用系统调用signal( )让父进 程捕捉键盘上来的中断信号(即按ctrl+c键),当捕捉到中断信号后,父进程用系统调用kill( )向两个子进程发出信号,子进程捕捉到信号...

    深入分析Linux内核源码.chm

    7.2 信号(signal) 7.3 System V 的IPC机制 第八章 虚拟文件系统 8.1 概述 8.2 VFS中的数据结构 8.3 高速缓存 8.4 文件系统的注册、安装与拆卸 8.5 限额机制 8.6 具体文件系统举例 8.7 文件系统的系统调用 8 .8 Linux...

    LINUX环境高级编程 第五章 信号

    信号的概念 signal函数 不可靠信号与可靠信号 信号的发送接收机制 信号集与可靠信号机制 sigsetjmp和siglongjmp函数 abort函数

    Linux内核中的信号机制??信号处理

    当进程被调度时,会调用do_notify_resume()来处理信号队列中的信号。信号处理主要是调用sighand_struct结构中对应的信号处理函数。do_notify_resume()(arch/arm/kernel/signal.c)函数的定义如下: asmlinkage void...

    Linux内核中的信号机制??信号发送

    应用程序发送信号时,主要通过kill进行。注意:不要被“kill”迷惑,它并...  ● pid=-1:信号被发送到任何一个进程,init进程(PID=1)和以及当前进程无法发送信号的进程除外。  ● pid<-1:信号被发送到目标进

    操作系统实验报告4-Linux软中断通信

    ①:了解linux软中断(Signal)的工作原理②:在Linux上使用C语言编写一个包含信号处理机制的程序,该程序中可以安装自己的信号处理程序;再此基础上发送一个对应的信号,验证自己安装的信号处理程序

    深入分析Linux内核源码

    7.2 信号(signal) 7.2.1 信号种类 7.2.2 信号掩码 7.2.3 系统调用 7.2.4 典型系统调用的实现 7.2.5 进程与信号的关系 7.2.6 信号举例 7.3 System V 的IPC机制 7.3.1 信号量 7.3.2 消息队列 7.3.3 共享内存...

    QT的信号与槽机制介绍

    信号与槽作为QT的核心机制在QT编程中有着广泛的应用,本文介绍了信号与槽的一些基本概念、元对象工具以及在实际使用过程中应注意的一些问题。 QT是一个跨平台的C GUI应用构架,它提供了丰富的窗口部件集,具有面向...

    linux下几种最常用的IPC接口,这样一来,统一了接口,提高代码重用性.rar

    linux除了支持Unix早期信号语义函数signal外,还支持语义符合Posix.1标准的信号函数sigaction(实际上,该函数是基于BSD的,BSD为了实现可靠信号机制,又能够统一对外接口,用sigaction函数重新实现了signal函数);...

    Linux高性能服务器编程

    10.1.3 Linux信号 10.1.4 中断系统调用 10.2 信号函数 10.2.1 signal系统调用 10.2.2 sigaction系统调用 10.3 信号集 10.3.1 信号集函数 10.3.2 进程信号掩码 10.3.3 被挂起的信号 10.4 统一事件源 10.5 ...

    Linux内核中的信号机制–从用户层到内核层

    注册信号主要用来确定信号值及进程针对该信号值的动作之间的映射关系,即进程将要处理哪个进程和该信号被传递给进程时,将执行何种操作。主要有两个函数实现信号的注册:signal()和sigaction()。  2、signal() ...

Global site tag (gtag.js) - Google Analytics