版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第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. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 茶叶营销合同范本
- 批发行业服务标准提升
- 餐馆隔断改造方案
- 账务核算合同范本
- 基于虚拟现实的模拟实践教学
- 非碘盐的危害
- 《XZ房地产公司销售人员流失现状与对策研究》
- 敏捷开发方法在软件工程中的应用
- 领导力与团队建设
- 2024年度烧烤店独家配方转让合同
- 初中安全教育课件《警惕网络陷阱》
- 2023年4月三级烟草专卖管理师岗位技能-试卷正文
- 六年级下册道德与法治教案-日益重要的国际组织 第一课时部编版
- 旅游景区管理制度完整汇编
- 汽车冲压焊接总成项目可行性研究报告
- 旅游地理学课程《旅游地理学》教学大纲
- 混凝土涵管安装现场质量检验报告单
- 华为-硬件工程师手册(全)
- 《国学智慧系列》之儒道禅与现代管理
- 无犯罪记录证明查证公函
- 第五章《中国的地理差异》导学案
评论
0/150
提交评论