第 7 章 Linux信号电子课件_第1页
第 7 章 Linux信号电子课件_第2页
第 7 章 Linux信号电子课件_第3页
第 7 章 Linux信号电子课件_第4页
第 7 章 Linux信号电子课件_第5页
已阅读5页,还剩33页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第7章Linux信号内容提要信号概述Linux系统中的信号信号的定义发送信号信号文件7.1信号概述信号概述

信号是进程对所发生事件的一种响应模式,例如,数据溢出和定时器到期等,内核预设了多种事件,为它们定义了相应的信号,并设置了对应的信号处理方式;当事件发生时,进程会收到相应的信号,进程暂停运行,转而执行对应的信号处理程序,待信号处理完成,进程从中断点恢复运行。通常,信号的发生具有异步性,它可能发生在进程运行过程中的任意时间点,所以,信号也称为一步信号。信号和中断在概念上具有相似性,信号属于操作系统的范畴,而中断属于处理器对外部设备事件的响应方式。应用编程接口分类API功能描述信号处理sigprocmask修改当前进程的信号掩码sigaction定义信号的处理方式sigpending检测到达的阻塞信号sigwaitinfo等待阻塞信号的到达发送信号kill向进程发送信号abort向进程发送SIGABRT信号sigqueue发送实时信号信号文件signalfd创建信号文件7.2Linux系统中的信号信号的分类标准信号标准信号源自Unix,信号编号以正整数表示,范围从1至31,内核仅用一位表示标准信号,当值为0,表示该位对应的信号未发生,若值为1,表示该位对应的信号已发生。实际时信号为弥补标准信号的某些不足,引入了实时信号,信号编号从32至64,每个实时信号在内核中用队列表示,支持排队和参数传递。信号编号值动作含义SIGHUP1Term与终端的连接断开SIGINT2Term终端中断SIGQUIT3Core终端退出SIGILL4Core非法指令SIGABRT6Core中止进程SIGFPE8Core浮点异常SIGKILL9Term杀死进程(不可屏蔽)SIGSEGV11Core段非法错误SIGPIPE13Term管道读写错误SIGALRM14Term实时计时器到期SIGTERM15Term终止进程SIGUSR130,10,16Term用户自定义信号SIGUSR231,12,17Term用户自定义信号SIGCHLD20,17,18Ign告知父进程,子进程终止SIGCONT19,18,25Cont若停止则继续SIGSTOP17,19,23Stop停止进程(不可屏蔽)SIGTSTP18,20,24Stop终端停止SIGTTIN21,21,26Stop后台进程从终端读取标准信号信号编号值动作含义SIGTTOU22,22,27Stop后台进程向终端写SIGBUS10,7,10Core总线错误SIGPROF27,27,29Term实用计时器到期SIGSYS12,31,12Core无效的系统调用SIGTRAP5Core跟踪/断点陷阱SIGURG16,23,21Ign套接字上的紧急数据SIGVTALRM26,26,28Term虚拟计时器到期SIGXCPU24,24,30CoreCPU时间限制超时SIGXFSZ25,25,31Core超过文件最大长度限制SIGIOT6Core与SIGABRT信号同义SIGEMT7,-,7Term模拟陷入SIGSTKFLT-,16,-Term协处理器错误SIGIO23,29,22TermI/O可能产生SIGCLD-,-,18Ign与SIGCHLD信号同义SIGPWR29,30,19Term电量即将耗尽SIGINFO29,-,-与SIGPWR信号同义SIGLOST-,-,-Term文件锁丢失(未使用)SIGWINCH28,28,20Ign终端窗口尺寸发生变化SIGUNUSED-,31,-CoreSIGSYS信号同义标准信号(续)动作类型含义Term结束进程Ign忽略信号Core结束进程并产生核心文件Stop暂停进程运行Cont恢复暂停进程的运行Linux信号的产生1.用户信号在用户与系统交互过程中产生,例如,当用户在键盘上输入Ctrl+C和Ctrl+\时,终端驱动程序通知内核将向目标进程发送信号SIGINT和SIGQUIT。2.内核内核在执行过程中产生,例如,异步I/O模式下,I/O状态就绪,内核向目标进程发送相应的信号SIGIO。3.进程一个进程向另一个进程发送信号,例如,进程通过调用kill函数向其他进程发送信号。信号的处理方式1.异步处理模式默认情况下,信号采用异步处理模式,信号可能发生在进程运行的任意时刻,当信号发生时,进程暂停运行,保存现场,转而执行信号处理程序,待信号处理程序执行完毕,恢复现场,从中断点继续运行。2.同步处理模式当信号被阻塞时,到达的信号不会马上处理,而是处于等待状态,进程可自主选择时机进行处理。信号的接收对象

在多线程环境下,线程共享进程的信号处理方式,但信号掩码各自独立,线程可屏蔽各自不感兴趣的信号,信号的发送目标可为进程或线程,当目标为进程时,进程中的线程均有机会处理到达的信号,机会取决于进程调度,当目标为线程时,由接收信号的线程处理。信号的延迟

信号除因阻塞而被延迟处理外,在未阻塞的情况下,从信号的产生到处理,可能存在一定的延迟,信号处理取决于下一个调度时机,例如,时间片耗尽后重新被选中、系统调用结束和中断返回。7.3信号的定义信号掩码

信号掩码是由一组信号构成的集合,当属于该集合的信号到达进程时,对信号不作任何处理,直至信号阻塞被解除,期间一直处于等待状态。设置信号掩码头文件

#include<signal.h>函数原型

int

sigprocmask(inthow,constsigset_t*set,sigset_t*oldset);功能 重置进程的信号掩码。参数

how:操作方式。

set:新信号集。

oldset:替换的信号掩码。返回值 成功,返回0,失败,返回-1。信号处理的定义sigaction(1/3)头文件

#include<signal.h>函数原型

int

sigaction(int

signum,conststruct

sigaction*act,struct

sigaction*oldact);功能 定义信号的行为。参数

signum:信号编号。

act:信号的处理方式。

oldact:原信号的处理方式。返回值 成功返回0,失败返回-1。信号处理的定义sigaction(2/3)

struct

sigaction{ //信号处理函数

void(*sa_handler)(int); //携带更多参数的信号处理函数

void(*sa_sigaction)(int,siginfo_t*,void*); //信号处理期间的信号掩码

sigset_t

sa_mask; //信号处理的更多特性

int

sa_flags; //glibc内部使用

void(*sa_restorer)(void);};信号处理的定义sigaction(3/3)siginfo_t{

int

si_signo;//信号编号

int

si_errno;//错误值

int

si_code;//信号来源的详细信息

pid_t

si_pid;//进程ID

uid_t

si_uid;//进程所属实际用户ID

int

si_status;//进程的结束状态

clock_t

si_utime;//进程消耗的用户时间

clock_t

si_stime;//进程消耗的系统时间

sigval_t

si_value;//信号传递的参数

int

si_overrun;//定时器溢出次数

int

si_timerid;//POSIX.1b定时器IDvoid*si_addr;//产生异常的地址

longsi_band;//I/O事件关联的事件值

int

si_fd;//与I/O事件相关的文件描述符...}实例分析voidhandler(int

signum){

printf("\nSIGINT

cought\n\n");}main(){

struct

sigactionact;

sigfillset(&(act.sa_mask));

act.sa_handler=handler;

sigaction(SIGINT,&act,NULL); pause()

printf("pausereturn\n",);}

到达的阻塞信号

当位于信号掩码的信号到达进程时,信号被阻塞,直至阻塞解除,期间信号处于阻塞状态。可分别通过sigpending和sigwaitinfo函数检测到达的阻塞信号和同步等待排队的信号。sigpending函数头文件

#include<signal.h>函数原型

int

sigpending(sigset_t*set);功能 检测到达的阻塞信号。参数

Set:指向到达的阻塞信号。返回值 成功,返回0,失败,返回-1。sigwaitinfo函数头文件

#include<signal.h>函数原型

int

sigwaitinfo(const

sigset_t*set,siginfo_t*info);功能 等待阻塞信号的到达。参数

set:等待的阻塞信号。

info:到达的阻塞信号。返回值 成功,返回0,失败,返回-1。

实例分析int

main(int

argc,char*argv[])

sigset_tset;

sigfillset(&set);

sigprocmask(SIG_SETMASK,&set,NULL); sleep(atol(argv[1])); for(;;){

siginfo_t

si;

int

sig=sigwaitinfo(&set,&si); if((sig==-1)||(sig==SIGINT||sig==SIGTERM)){

printf("sigwaitinfofailed|SIGINT|SIGTERM\n"); exit(0); }

printf("getsignal:%d\t%s\n",sig,strsignal(sig));

printf("si_signo=%d,si_code=%d(%s),si_value=%d\n",

si.si_signo,si.si_code, (si.si_code==SI_USER)?"SI_USER": (si.si_code==SI_QUEUE)?"SI_QUEUE":"other",

si.si_value.sival_int);

printf("si_pid=%ld\tsi_uid=%ld\n",(long)si.si_pid,(long)si.si_uid); }}7.4发送信号发送标准信号头文件

#include<sys/types.h #include<signal.h>函数原型

int

kill(pid_t

pid,int

sig);;功能 向进程发送信号。参数

pid:进程ID。

sig:信号编号。返回值 调用成功返回0,否则返回-1。参数pid含义pd>0目标进程的ID为pidpid=0调用者进程所属组中的所有进程pid=-1除初始化进程init外,有权发送的所有进程pid<-1进程组ID为-pid的所有进程发送实时信号sigqueue函数头文件

#include<sys/types.h> #include<signal.h>函数原型

int

sigqueue(pid_t

pid,int

sig,constunionsigval

val);功能 向进程发送实时信号。参数

pid:目标进程ID。

sig:实时信号编号。

val:传递的参数。返回值 成功返回0;失败返回-1。发送实时信号

sigqueue函数向进程pid发送实时新号sig,并携带参数val,val为sigval类型指针,sigval类型的定义如下。typedefunionsigval{

int

sival_int; //用于传送一个整型数

void*sival_ptr; //指向参数地址

}sigval_t;

sigqueue函数基于rt_sigqueueinfo系统调用实现,接收实时信号的进程需通过sigaction函数的SA_SIGINFO选项定义信号处理函数,以便接收信号和携带的数据。7.5信号文件信号文件

信号文件是一种将到达的信号作为字节流的特殊文件。

Linux内核自2.6.22引入了一种非标准的系统调用接口eventfd、signalfd和timerfd,它们将事件、信号和到期时间抽象为字节流,其中signalfd便是信号文件的应用编程接口。信号文件signalfd函数头文件

#include<sys/signalfd.h>函数原型

int

signalfd(int

fd,constsigset_t*mask,intflags);功能 创建信号文件。参数

fd:文件描述符。

mask:监听的信号集。

flags:打开方式。返回值 成功:返回文件描述符,失败,返回-1。信号文件(续)struct

signalfd_siginfo{uint32_tssi_signo;//信号编号

int32_tssi_errno;//错误码(未使用

int32_tssi_code;//信号码

uint32_tssi_pid;//发送进程IDuint32_tssi_uid;//发送用户实际IDint32_tssi_fd;//文件描述符(SIGIO)uint32_tssi_tid;//内核定时器IDuint32_tssi_band;//I/O事件(SIGIO)*/......uint8_tpad[X];//扩充成员变量};参数flags

含义SFD_NONBLOCK非阻塞方式读写文件SFD_CLOEXEC设置close-on-exec选项signalfd函数中参数flags的定义实例分析int

main(int

argc,char*argv[]){

sigset_tmask;

sigemptyset(&mask);

sigaddset(&mask,SIGQUIT);

sigaddset(&mask,SIGUSR1);

sigprocmask(SIG_BLOCK,&mask,NULL);

int

sfd=signalfd(-1,&mask,0); for(;;){

struct

signalfd_siginfo

fdsi;

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论