一 信号的基本概念

  信号:是向进程发送的软件通知,通知进程有事件发生。

  生成:表示一个信号的产生。

  捕获:表示接收到一个信号。

  信号的寿命:信号的生成和传递之间的时间间隔。

  挂起的信号:已经生成但还未被传递的信号。

二 产生信号

  每个信号名都是以SIG开头,信号的名字都定义在signal.h中,POSIX必需的信号如下:


  信号         描述 


  SIGABRT       进程放弃(signal abort)

  SIGALRM       告警时钟(signal alarm)

  SIGBUS       访问了内存对象中的为定义部分

  SIGCHLD       子进程被终止,停止或继续(signal child)

  SIGCONT       如果进程被停止了,本信号使进程继续执行(signal continue)

  SIGFPE       算术计算中出现了被零除这样的错误

  SIGHUP       在控制终端(进程)上挂起(死亡)

  SIGILL         无效的硬件指令

  SIGINT        交互终端提示信号(通常是Ctrl-C)

  SIGKILL       终止(signal kill)

  SIGPIPE       向一个没有读程序的管道写入(signal pipe)

  SIGQUIT       交互终端终止(通常是Ctrl-l)(signal quit)

  SIGSEGV        无效的内存引用

  SIGSTOP        执行停止(signal stop)

  SIGTERM       终止(signal terminate)

  SIGTTIN       后台进程试图进行读操作(signal try to input)

  SIGTTOU        后台进程试图进行写操作(signal try to output)

  SIGURG       在套接字上有高速宽数据

  SIGUSR1        用户定义的信号1

  SIGUSR2        用户定义的信号2


  1  函数kill

#include <signal.h>

int kill(pid_t pid,    //进程ID
     int sig      //信号码
     );          //成功返回0,不成功返回-1并设置errno

  参数pid的取值:>0            kill就向那个ID表示的进程发送信号

           =0      kill就向调用程序的进程组成员发送信号

           -1       kill就向所有它有权发送信息的进程发送信号

          其它负值    就将信号发送到组ID等于|pid|的进程组中去  

  kill的实现必须检测的错误及相应的错误码:EINVAL:sig是一个无效的或不被支持的信号

                      EPERM:调用程序没有适当的权限

                      ESRCH:没有进程或进程组对应于pid

  例子:向进程1000发送SIGUSR1 

if(kill(,SIGUSR1)){

    perro("Failed to send the SIGUSR1 signal");

}

  注:查找相关进程ID的常用方法是使用getpid(获取当前进程ID),getppid(获取当前进程的父进程ID),getpgid(获取当前进程的进程组ID),或者通过保存从fork中返回的值来查找。

  2 函数raise

#include <signal.h>

int raise(int sig);  //成功,返回0,不成功如果sig是无效的,raise函数就将error设置为EINVAL

  raise函数用来向自己发送一个信号。

  例子:使进程向自己发送一个SIGUSR1信号

if(raise(SIGUSR1)!=){

  perror("Failed to raise SIGUSR1");

}

  3 函数alarm

#include <unistd.h>

unsigned alarm(unsigned seconds);

  alarm函数用来在seconds秒之后安排发送一个SIGALRM信号,alarm函数从来不报告错误。

三 对信号掩码和信号集的操作

  信号掩码:当前被阻塞的信号的集合,类型为sigset_t.

  对信号集的操作由以下五个函数组成:

#include <signal.h>

int sigaddset(sigset_t *set,int signo);        //将signo加入信号集

int sigdelset(sigset_t *set,int signo);        //将signo从信号集中删除

int sigemptyset(sigset_t *set);             //对信号集初始化,使其不包含任何信号

int sigfillset(sigset_t *set);             //对信号集初始化,使其包含所有信号

int sigismember(const sigset_t *set,int signo);   //报告signo是否在*set中,如果在,返回1,否则返回0

  例子:对信号集twosigs进行初始化,使其包含两个信号SIGINT和SIGQUIT

if((sigemptyset(&twosigs)==- || sigaddset(&twosigs,SIGINT)==- || sigaddset(&twosigs,SIGQUIT)==-)){

  perror("Failed to set up signal mask");

}

  进程可以用sigprocmask函数来检查或修改它的进程信号掩码,sigprocmask函数可以根据参数how指定的方法修改进程的信号掩码。新的信号掩码由参数set指定,而原先的信号掩码将保存到信号集oset中,声明如下:

#include <signal.h>

int signalprocmask(int how,                //用来说明信号掩码的修改方式
           const sigset_t *restrict set,    //指向一个信号集的指针,在修改中要用到这个信号集,如果为NULL,就说明不需要进行修改
           sigset_t *restrict oset        //如果不为NULL,sigprocmask会将修改之前的信号集放在*oset中返回
           );

  参数how取以下三个值中的一个:

  SIG_BLOCK:向当前被阻塞的信号中添加一个信号集

  SIG_UNBLOCK:从当前被阻塞的信号中删除一个信号集

  SIG_SETMASK:将指定的信号集设置为被阻塞的信号

  例子:将SIGINT添加到进程已经阻塞的信号集中去

sigset_t newsigset;

if((sigemptyset(&newsigset)==- || sigaddset(&newsigset,SIGINT)==-)){

  perror("Failed to initialize the signal set");

}

else if(sigprocmask(SIG_BLOCK,&newsigset,NULL)==-){

  perror("Failed to block SIGINT");

}

Linux学习笔记18——信号1的更多相关文章

  1. Linux学习笔记19——信号2

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

  2. Linux学习笔记(18) Shell编程之流程控制

    1. if语句 (1) 单分支if条件语句 格式为: # 注意条件判断式两端的空格if [ 条件判断式 ];then 程序员 fi 或者 if[ 条件判断式 ] then 程序 fi 例:判断分区使用 ...

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

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

  4. Linux 学习笔记

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

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

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

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

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

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

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

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

    Linux学习笔记之超详细基础linux命令 by:授客 QQ:1033553122   说明:主要是在REHL Server 6操作系统下进行的测试 --字符界面虚拟终端与图形界面之间的切 方法:[ ...

  9. Linux学习笔记-Linux系统简介

    Linux学习笔记-Linux系统简介 UNIX与Linux发展史 UNIX是父亲,Linux是儿子. UNIX发行版本 操作系统 公司 硬件平台 AIX IBM PowerPC HP-UX HP P ...

随机推荐

  1. Log4net 集成到MVC+EF框架

    前提引用Log4Net.dll文件 1. [assembly: log4net.Config.XmlConfigurator(ConfigFile = "Web.config", ...

  2. android下面res目录

    1. 相关文件夹介绍      在Android项目文件夹里面,主要的资源文件是放在res文件夹里面的.assets文件夹是存放不进行编译加工的原生文件,即该文件夹里面的文件不会像xml,java文件 ...

  3. linux常用命令(自我积累)

    创建目录:mkdir + 目录名 使文件可执行:chmod +x filename 执行文件:./filename 来执行您的脚本 {程序必须以下面的行开始(必须方在文件的第一行): #!/bin/s ...

  4. 跨域的小小总结:js跨域及跨域的几种解决方法

    一.什么是跨域?? js跨域请求就是使用js访问iframe里的不同域名下的页面内容,比如用ajax向一个不同的域请求数据,或者通过js获取页面中不同的域的iframe框架中的数据.即只要域名.协议. ...

  5. DependencyProperty

    <Window x:Class="DependencyPropertyDemo.MainWindow" xmlns="http://schemas.microsof ...

  6. JavaScript各种遍历方式详解

    为了方便例子讲解,现有数组和json对象如下 var demoArr = ['Javascript', 'Gulp', 'CSS3', 'Grunt', 'jQuery', 'angular']; v ...

  7. chkconfig-增加一个服务设置服务自启动

    参考 http://www.cnblogs.com/panjun-Donet/archive/2010/08/10/1796873.html 如何增加一个服务: 1.服务脚本必须存放在/etc/ini ...

  8. 配置并学习微信JS-SDK(2)—图片接口

    测试地址:http://www.qq210.com/shoutu/android 检查图像接口 选择本地或拍照的图片 上传选择的图片 预览上传的图片 //1.检查图像接口 document.query ...

  9. double类型字符串转换成一个纯数字字符串和一个小数点位数的c++代码

    今天工作中遇到一个要不一个double型的字符串转换成一个纯字数字符串和一个标志这个数字字符串的小数点有几位的int类型 例如:“23.123”--->“23123” + 3   比较简单.就是 ...

  10. linux系统下,递归删除.svn文件

    linux系统下,递归删除.svn文件 SVNLinux 进入要删除的目录,执行下面的命令就可以啦. find . -name "*.svn"  | xargs rm -rf