第十章
        信号
    信号是软中断,提供了一种处理异步事件的方法。例如,终端用户键入终端键,会通过信号机制停止一个进程,
或及早终止管道中的下一个程序。
    每个信号都有一个名字,SIG开头。例如:
    SIGABRT:夭折信号,当进程调用abort函数时产生。
    SIGALRM:闹钟信号,由alarm函数设定时器超时后将产生此信号。
    当信号出现时,可以告诉内核按下列三种方式之一进行处理:
    (1)忽略此信号。butSIGKILL和SIGSTOP不能忽略。他们向内核和超级用户提供了使进程终止或停止的可靠方法。另外,硬件异常产生的信号也不能忽略。
    (2)捕捉信号。
    (3)执行系统默认动作。

函数signal:
    UNIX系统信号机制最简单的接口是signal函数。
    void (*signal (int signo, void (*func)(int))) (int);    返回值:成功,返回以前的信号处理配置;出错,返回SIG_ERR。
    signo信号名(SIGABRT等);
    func取值可以是:
        常量SIG_IGN 表示忽略此信号
        常量SIG_DFL 表示接到此信号后动作是系统默认动作
        函数地址 信号发生时,调用该函数。

函数kill和raise:
    kill和raise函数用来发送信号。
    kill函数将信号发送给进程或进程组。raise函数则允许进程向自身发送信号。
    调用
        raise(signo);
    等价于调用
        kill(getpid(), signo);
            pid > 0 将信号发送给进程ID为pid的进程;
            pid == 0 将信号发送给同组的所有进程
            pid < 0 将信号发给进程组ID= 绝对值|pid|
            pid == -1 将信号发送给可达的所有进程
    进程发送信号给其他进程需要权限。超级用户可以将信号发送给任一进程;非超级用户,发送者的实际用户ID或有效用户ID必须等于接收者的实际用户ID或有效用户ID。
        特例是SIGCONT信号(使暂停进程继续)

函数alarm和pause:
    
    alarm(unsigned int seconds);
        (1)经过seconds会产生一个SIGALRM信号,如果忽略或不捕获这个信号,将会终止调用alarm的进程。
        (2)一个进程只能有一个闹钟。如果在调用alarm时,之前已注册了但是还没“响”,那么会重置为新闹钟,新闹钟的时间设置为上次时间的剩余值。
        (3)在进行阻塞式系统调用时,为避免进程陷入无限期的等待,可以为这些阻塞式系统调用设置定时器。Linux提供了alarm系统调用和SIGALRM信号实现这个功能。
           read就是一个阻塞式系统调用,所以可用 alarm + read 实现限时读入。
           因为在调用read之前进程发生了阻塞情况,导致read之前就已经错过了闹钟的信号,可能会使得read进程永久的阻塞下去。可以使用setjmp和longjmp来避免这种情况。       
    
    pause(void):
        使调用进程挂起直至捕捉到一个信号。只有执行了一个信号处理程序并从其返回时,pause才返回。在这种情况下,pause返回-1,errno设置未EINTR。
        
信号集(sigset_t):
    能表示多个信号的数据结构--信号集
    用一个整型表示每一位代表一个信号

函数sigprocmark(操纵sigset_t):
        一个进程的信号屏蔽字规定了当前阻塞而不能递送给该进程的信号集。sigprocmask()可以用来检测或改变目前的信号屏蔽字,其操作依参数how来决定,如果参数oldset不是NULL指针,
        那么目前的信号屏蔽字会由此指针返回。如果set是一个非空指针,则参数how指示如何修改当前信号屏蔽字。每个进程都有一个用来描述哪些信号递送到进程时将被阻塞的信号集,
    该信号集中的所有信号在递送到进程后都将被阻塞。
        参数how的取值不同,带来的操作行为也不同,该参数可选值如下:
        1.SIG_BLOCK: 该值代表的功能是将newset所指向的信号集中所包含的信号加到当前的信号掩码中,作为新的信号屏蔽字。
        2.SIG_UNBLOCK:将参数newset所指向的信号集中的信号从当前的信号掩码中移除。
        3.SIG_SETMASK:设置当前信号掩码为参数newset所指向的信号集中所包含的信号。
        注意事项:sigprocmask()函数只为单线程的进程定义的,在多线程中要使用pthread_sigmask变量,在使用之前需要声明和初始化。

函数sigpending:
    返回在阻塞期间接收到阻塞信号的集合
    
函数sigaction:
    检查或修改(或both)与执行信号相关联的处理动作。
    sigaction可以用来实现signal函数,这里略作详解:cnblog/sigaction
    
    int sigaction(int signo,conststruct sigaction*restrict act,

             struct sigaction*restrict oact);
    
函数sigsetjmp和siglongjmp:
    非局部转移使用setjmp和longjmp函数。longjmp返回到程序的主循环,而不是从该处理程序返回。
    考虑到对信号屏蔽字的作用,定义了两个新的函数 sigsetjmp和siglongjmp
    
函数sigsuspend:
    保护不希望由信号中断的代码临界区。不被特定信号中断。
    友情提示:pr_mask 函数用来打印当前信号屏蔽字。

函数abort:
    是程序异常终止.
    进程可以捕捉SIGABRT信号:在进程终止之前由其执行所需的清理操作.
    
函数system:
    返回shell终止状态值
    
函数sigqueue:
    信号队列.只能将信号发送给单个进程.
    
每天学一啾啾Linux命令:
(1)强行中止(经常使用杀掉)一个进程标识号为324的进程:
    #kill -9 324

UNIX环境高级编程--10. 信号的更多相关文章

  1. UNIX环境高级编程——可靠信号与不可靠信号

    在早期的UNIX中信号是不可靠的,不可靠在这里指的是:信号可能丢失,一个信号发生了,但进程却可能一直不知道这一点. 现在Linux 在SIGRTMIN实时信号之前的都叫不可靠信号,这里的不可靠主要是不 ...

  2. Unix环境高级编程(十)信号续

    1.signal函数 Unix系统的信号机制最简单的接口是signal函数,函数原型如下: #include <signal.h> typedef void (*sighandler_t) ...

  3. Unix环境高级编程(九)信号

    信号时软中断,很多比较重要的应用程序都需要处理信号,信号提供了一种处理异步事件的方法.每个信号都一个名字,以SIG开头,在<signal.h>头文件中定义信号类型,都是正整数(信号编号). ...

  4. (八) 一起学 Unix 环境高级编程 (APUE) 之 信号

    . . . . . 目录 (一) 一起学 Unix 环境高级编程 (APUE) 之 标准IO (二) 一起学 Unix 环境高级编程 (APUE) 之 文件 IO (三) 一起学 Unix 环境高级编 ...

  5. (一) 一起学 Unix 环境高级编程 (APUE) 之 标准IO

    . . . . . 目录 (一) 一起学 Unix 环境高级编程 (APUE) 之 标准IO (二) 一起学 Unix 环境高级编程 (APUE) 之 文件 IO (三) 一起学 Unix 环境高级编 ...

  6. (二) 一起学 Unix 环境高级编程 (APUE) 之 文件 IO

    . . . . . 目录 (一) 一起学 Unix 环境高级编程 (APUE) 之 标准IO (二) 一起学 Unix 环境高级编程 (APUE) 之 文件 IO (三) 一起学 Unix 环境高级编 ...

  7. (三) 一起学 Unix 环境高级编程 (APUE) 之 文件和目录

    . . . . . 目录 (一) 一起学 Unix 环境高级编程 (APUE) 之 标准IO (二) 一起学 Unix 环境高级编程 (APUE) 之 文件 IO (三) 一起学 Unix 环境高级编 ...

  8. (四) 一起学 Unix 环境高级编程(APUE) 之 系统数据文件和信息

    . . . . . 目录 (一) 一起学 Unix 环境高级编程 (APUE) 之 标准IO (二) 一起学 Unix 环境高级编程 (APUE) 之 文件 IO (三) 一起学 Unix 环境高级编 ...

  9. (五) 一起学 Unix 环境高级编程 (APUE) 之 进程环境

    . . . . . 目录 (一) 一起学 Unix 环境高级编程 (APUE) 之 标准IO (二) 一起学 Unix 环境高级编程 (APUE) 之 文件 IO (三) 一起学 Unix 环境高级编 ...

随机推荐

  1. 转--webservice、socket、http 小记(一)

    webservice.socket.http 小记(一) http://blog.csdn.net/m_123hj_520/article/details/9370723 2013-07-18 17: ...

  2. 异步等待(ManualResetEvent

    ManualResetEvent实现异步等待,超过时间 不做处理,继续往下执行代码 (ManualResetEvent 涉及一个线程在其他线程进行之前必须完成的任务) ManualResetEvent ...

  3. SpringMVC学习系列(2) 之 经典的HelloWorld实现

    前一篇简单介绍了Spring MVC的一些知识,下面就要开始学习如何把Spring MVC运用到具体的项目中去. 首先还是从一个简单的Hello World项目说起: 我机器的开发环境为: Ubunt ...

  4. Linux下实现获取远程机器文件

    创建公钥秘钥实现无密码登录后即可获取到文件内容了!! A:xxx.xxx.6.xxx B:xxx.xxx.xxx.x 一.创建 A机器 ssh-keygen -t rsa 二.拷贝——将生成的公钥复制 ...

  5. python xlwt,xlutils 在excel里面如何插入一行数据

    就是把插入行之后值重新输出来. 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 import xl ...

  6. python的json模块

    Python JSON 本章节我们将为大家介绍如何使用 Python 语言来编码和解码 JSON 对象. 环境配置 在使用 Python 编码或解码 JSON 数据前,我们需要先安装 JSON 模块. ...

  7. oracle start with connect by prior 递归查询

    Oracle中的select语句可以用start with...connect by prior子句实现递归查询,connect by 是结构化查询中用到的, 其基本语法是: select ... f ...

  8. .net 中生成二维码的组件

    http://qrcodenet.codeplex.com/

  9. Intel汇编语言程序设计学习笔记1

    第一章 汇编器链接器:汇编器将汇编语言翻译成机器语言,链接器将单个文件合并为可执行文件 intel 80X86系列处理器的汇编语言与VAX或者motorala 68x00等系统的汇编是否相同?不相同, ...

  10. 【知识点】业务连接服务(BCS)认证概念整理

    业务连接服务(BCS)认证概念整理 I. BDC认证模型 BDC服务支持两种认证模型:信任的子系统,模拟和代理. 在信任的子系统模型中,中间层(通常是Web服务器)通过一个固定的身份来向后端服务器取得 ...