上一节中讲到了sigprocmask函数,它的作用是检查或修改它的进程信号掩码,这一节我们主要学习捕捉与忽略信号的函数sigaction和等待信号函数。

一  sigaction函数的作用

  定义在接收到参数sig指定的信号后应该采取的行动,声明如下:

#include <signal.h>

int sigaction(int sig,                //指定动作的信号码
        const struct sigaction * act,    //说明要采取的动作,如果为NULL,对sigaction的调用就不能改变与信号相关的动作
        struct sigaction *oact        //负责接收与信号相关的前一个动作,如果为NULL,对sigaction的调用就不会返回与信号相关的前一个动作
        );

  我们注意到,上面的参数中出现了struct sigaction的结构,该结构体的成员如下:  

struct sigaction{

    void (*sa_handler)(int);    //SIG_DFL,SIG_IGN或者指向函数的指针,SIG_DFL的值说明sigaction应该恢复信号的默认行为,
                      //                   SIG_IGN的值说明进程应该忽略信号 
    sigset_t sa_mask;        //处理程序的执行过程中需要阻塞的额外的信号     int sa_flags;          //特殊的标志符和选项   }

  参数sa_flags的取值如下:

  SA_NOCLDSTOP     子进程停止时不产生SIGCHLD信号
  SA_RESETHAND      将对此信号的处理方式在信号处理函数的入口重置为SIG_DFL
  SA_RESTART      重启可中断的函数而不是给出EINTR错误
  SA_NODEFER     捕获到信号时不将它添加到信号掩码中

  例子:

#include <signal.h>
#include <stdio.h>
#include <unistd.h> void ouch(int sig){
printf("OUCH! - I got signal %d\n",sig);
} int main(){
struct sigaction act;
act.sa_handler=ouch;
act.sa_flags=;
sigemptyset(&act.sa_mask); sigaction(SIGINT,&act,); while(){
printf("Hello world\n");
sleep();
}
}

结果如下:

二 等待信号——sigsuspend和sigwait

  1 sigsuspend函数

#include <signal.h>

int sigsuspend(const sigset_t *sigmask);

  sigsuspend函数用sigmask指向的那个掩码来设置信号掩码,并将进程挂起,直到进程捕捉到信号为止。

  2 sigwait函数

#include <signal.h>

int sigwait(const sigset_t *restrict sigmask,int *restrict signo);

  sigwait函数一直阻塞到*sigmask指定的任何一个信号被挂起为止,然后从挂起信号集中删除那个信号,并解除对它的阻塞。当sigwait返回时,从挂起信号集中删除的信号的个数被存储在signo指向的那个位置中。

  3 sigsuspend和sigwait区别

  这两个函数的第一个参数都是指向信号集的指针(sigset_t *)。对sigsuspend来说,这个信号集装载的是新的信号掩码,因此不在信号集中的信号是能使sigsuspend返回的信号。对sigwait来说,这个参数中装载的是需要等待的信号集,因此在信号集中的信号是能使sigwait返回的信号。与sigsuspend不同,sigwait没有改变进程的信号掩码,sigmask中的信号应该在调用sigwait之前被阻塞起来。

Linux学习笔记19——信号2的更多相关文章

  1. Linux学习笔记19-ssh远程管理

    远程管理 服务器一般运行在IDC机房中,一般都是通过远程管理方式对服务器进程控制. 常见的远程管理工具: RDP(remote desktop protocol)协议,window远程桌面管理 Tel ...

  2. Linux学习笔记(19) Linux服务管理

    1. 服务的分类 Linux服务可分为RPM包默认安装的服务和源码包安装的服务.前者可细分为独立的服务(直接作用于内存中)和基于xinetd服务.xinetd本身是独立的服务,其唯一的功能是管理其他服 ...

  3. Linux学习笔记18——信号1

    一 信号的基本概念 信号:是向进程发送的软件通知,通知进程有事件发生. 生成:表示一个信号的产生. 捕获:表示接收到一个信号. 信号的寿命:信号的生成和传递之间的时间间隔. 挂起的信号:已经生成但还未 ...

  4. Linux学习笔记(六) 进程管理

    1.进程基础 当输入一个命令时,shell 会同时启动一个进程,这种任务与进程分离的方式是 Linux 系统上重要的概念 每个执行的任务都称为进程,在每个进程启动时,系统都会给它指定一个唯一的 ID, ...

  5. Linux 学习笔记

    Linux学习笔记 请切换web视图查看,表格比较大,方法:视图>>web板式视图 博客园不能粘贴图片吗 http://wenku.baidu.com/view/bda1c3067fd53 ...

  6. linux —— 学习笔记(汇总)

    笔记目录:一.系统知识 和 基本概念                    二.常用操作                   三.系统管理(内存.设备.服务等管理)                   ...

  7. Linux 学习笔记之超详细基础linux命令 Part 14

    Linux学习笔记之超详细基础linux命令 by:授客 QQ:1033553122 ---------------------------------接Part 13---------------- ...

  8. Linux 学习笔记之超详细基础linux命令 Part 12

    Linux学习笔记之超详细基础linux命令 by:授客 QQ:1033553122 ---------------------------------接Part 11---------------- ...

  9. Linux 学习笔记之超详细基础linux命令 Part 11

    Linux学习笔记之超详细基础linux命令 by:授客 QQ:1033553122 ---------------------------------接Part 10---------------- ...

随机推荐

  1. ASP.NET得到系统相关信息

      1. 在ASP.NET中专用属性: 获取服务器电脑名:Page.Server.ManchineName 获取用户信息:Page.User 获取客户端电脑名:Page.Request.UserHos ...

  2. Wi-Fi无线网络下行速度超级慢 (5kb/s)之解决方案

    转载:http://www.iplaysoft.com/wifi-slow-solution.html 作者:X-Force 转载原因:该文分类提出了多种解决方案,并详述其原因.简洁清晰,可作为参考方 ...

  3. sqlserver2005唯一性约束

    [转载]http://blog.163.com/rihui_7/blog/static/21228514320136193392749/ 1.设置字段为主键就是一种唯一性约束的方法,如   int p ...

  4. Flex:CSS3布局利器

    实习以来做了三个小控件,都是用的CSS2.1里传统的DIV+CSS布局方式,综合使用position.margin.float.BFC等属性或特性将元素放到指定的位置上.然而面对日益复杂的界面,这些来 ...

  5. css文件加载:@import和link的区别

    刚看了一个百度试题:请简述CSS加载方式link和@import的区别? 平时一般都用link,也知道css的加载方式,但还真的没有仔细研究过其之间的差别,查了一些资料,大致总结如下: @impot使 ...

  6. 菜鸟日记之 java中的集合框架

    java中的集合框架图 如图所示:java中的集合分为两种Collection和Map两种接口 可分为Collection是单列集合和Map的双列集合 Collection单列集合:继承了Iterat ...

  7. POJ_3143 验证“歌德巴赫猜想”

    今天晚上的火车回家啦.所以提前更出来~.愉快的收拾我的包裹~滚回家吃半个月~胖几斤又要回学校啦~ T T这个假期虽然很忙.但是我觉得很有意义.很有价值~爱你们~ 描述 验证“歌德巴赫猜想”,即:任意一 ...

  8. mysql 刘道成视频教程1、2课----------大致结构

    第1课 第2课 一.整体结构 1.mysql -h localhost -u root -p *** 如果-h不写,则默认连接localhost. 2.连接服务器成功,-------> 显示数据 ...

  9. OPENCV

    opencv_ts300.libopencv_world300.lib IlmImfd.lib libjasperd.liblibjpegd.liblibpngd.lib libtiffd.lib l ...

  10. C#连接、访问MySQL数据库

    一.准备工具 visual stuido(本示例使用visual studio 2010) MySql.Data.dll mysql_installer_community_V5.6.21.1_set ...