第十章
        信号
    信号是软中断,提供了一种处理异步事件的方法。例如,终端用户键入终端键,会通过信号机制停止一个进程,
或及早终止管道中的下一个程序。
    每个信号都有一个名字,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. UVa 10815 安迪的第一个字典

    https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem& ...

  2. IAR for msp430 MDK中 warning: #223-D: function "xxx" declared implicitly 解决方法

    今天在EINT的范例里添加了一个函数,即eint.c中添加了一个datawrite()的函数,并在主函数main.c中调用,编译便警告 warning: #223-D: function " ...

  3. Java引用总结--StrongReference、SoftReference、WeakReference、PhantomReference

    Java引用总结--StrongReference.SoftReference.WeakReference.PhantomReference 1 Java引用介绍 Java从1.2版本开始引入了4种引 ...

  4. linux项目-之系统安装部署-cobbler

    http://cobbler.github.io/manuals/2.6.0/1/1_-_Release_Notes.html http://www.osyunwei.com/archives/760 ...

  5. linux shell 使用总结

    为什么执行脚本要使用./ +脚本名来执行脚本理解:因为如果直接使用脚本名,那么linux 系统会去path 路径查找如去/bin usr/bin 等查找,这个时候会找不到这个脚本名字,就会报错.使用. ...

  6. Win7打补丁以后vs2012突然出现的程序版本不兼容问题

    装这个: Update for Microsoft Visual Studio 2012 (KB2781514) http://www.microsoft.com/en-us/download/det ...

  7. Property ClientHeight does not exist 问题解决

    delphi的TFrame继承自另一个TFrame时,最好通过File->New->Other...->Delphi Projects->Inheritable Items 的 ...

  8. 一、Owin Identity的使用

    参照http://www.cnblogs.com/r01cn/p/5177708.html教程. 注意点: 1.Nuget包分别下载Microsoft.AspNet.Identity(Owin必须), ...

  9. 2014年第五届蓝桥杯C/C++程序设计本科B组决赛

    1.年龄巧合(枚举) 2.出栈次序(推公式/Catalan数) 3.信号匹配(kmp) 4.生物芯片(完全平方数) 5.Log大侠(线段树) 6.殖民地 1.年龄巧合 小明和他的表弟一起去看电影,有人 ...

  10. [IIS]IIS扫盲(五)

    第二篇 IIS之FTP服务器 一.建立你的FTP站点 第一个FTP站点(即“默认FTP站点”)的设置方法和更多FTP站点的建立方法请参照前文Web服务器中相关操作执行.需要注意的是,如果你要用一个IP ...