




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
Unix/Linux信号处理
守护进程(daemon)讲师:朱景尧C语言C++语言传智播客
高薪就业Contents信号概念
捕获信号发送信号123改进的捕获信号机制
4使用自定义信号
5守护进程(daemon)6第一章信号概念程序在执行的时候,几乎任何时刻都会发生事件。信号通常用来向一个进程通知事件。信号是不可提前预知的,所以信号是异步的信号随时都可能发生,接收信号的进程也可以没有控制权。每个信号名都以SIG开头,信号名的定义在<signal.h>中。第一章信号概念许多情况下都会出现信号,如硬件异常,非法的内存引用,软件异常等等。前面讲过的kill函数就是向目标进程发一个SIGKILL信号,就和kill命令一样。当进程收到一个信号,它可以对信号采取如下三种措施之一忽略这个信号;捕获这个信号,这需要执行一段称为信号处理器的特殊代码;允许执行信号的默认操作。第一章信号概念当信号发生的事件出现时,比如硬件异常,就会产生一个针对具体进程的信号。当进程对发送给它的信号采取措施的时候,就叫该信号被传送。产生信号和递送信号之间的时间间隔称为信号未决。第一章信号概念信号的部署是指进程如何响应信号。进程可以忽略信号、用默认操作处理信号、响应这个信号。进程不能简单的通过判断一个变量,例如errno来判断是否出现了一个信号。第一章信号概念常见信号说明信号名说明SIGABRT调用abort产生此信号,进程异常终止。SIGALRM调用alarm设置计时器超时时,产生此信号。SIGHLD一个进程终止时发送该信号给其父进程。SIGFPE表示一个算数运算异常,例如除以0SIGINT用户按Ctrl+C键,产生该信号SIGKILL这是个不能被捕捉或忽略的信号,kill9发送该信号SIGPIPE如果在写到管道时读进程已经终止,就产生该信号SIGSEGV该信号指示进程进行了一次无效的内存引用SIGTERM由kill命令(1)发送的系统默认终止信号SIGTSTP用户按Ctrl+Z键产生该信号SIGUSR1用户定义信号,可用于应用程序SIGUSR2用户定义信号,可用于应用程序Contents信号概念
捕获信号发送信号123改进的捕获信号机制
4使用自定义信号
5守护进程(daemon)6第二章捕获信号pause函数挂起调用它的进程,直到有任何消息到达。调用进程必须由能力处理送达的信号,否则信号的默认部署就会发生。。#include<unistd.h>intpause(void);只有进程捕获到一个信号的时候pause才返回,如果递送到的信号引发了对信号的处理,那么处理工作将在pause返回前执行。pause总是返回-1,并且变量errno设置为EINTR。第二章捕获信号发送信号和捕获信号是相辅相成的。每个进程能够决定响应除了SIGSTOP和SIGKILL之外的其他所有信号SIGSTOP和SIGKILL不能被捕获或者忽略。捕获信号不是真的去捕获它,而是等待信号被发送过来。第二章捕获信号当执行一个程序的时候,所有信号的状态都是系统默认或者忽略。当一个进程调用fork的时候,其子进程继承父进程的信号处理方式,所以信号捕捉函数的地址在子进程中是有意义的。第二章捕获信号定义信号处理器。某些情况下,一个信号的默认动作就是所希望的行为。但更多场合下,你可以改变默认行为或者执行额外的代码。如果想改变默认行为就必须定义并安装一个自动以的信号处理器。第二章捕获信号指向函数的指针可以用指针变量指向整形变量、字符串、数组、结构体、也可以指向一个函数。一个函数在编译时被分配一个入口地址。这个入口地址就称为函数指针。可以用一个指针变量指向函数,然后通过该指针变量调用此函数。第二章捕获信号intfunc(inti1,inti2){ returni1+i2;}intmain(){ int(*pfunc)(int,int); pfunc=func; printf("%d\n",pfunc(3,5)); return0;}函数指针例子第二章捕获信号回调函数回调函数就是一个通过函数指针调用的函数。如果把函数的指针(地址)作为参数传递给另一个函数,当这个指针被用来调用其所指向的函数时,我们就说这是回调函数。回调函数不是由该函数的实现方直接调用,而是在特定的事件或条件发生时由另外的一方调用的,用于对该事件或条件进行响应。Windows编程下的窗口过程就是典型的回调函数。第二章捕获信号signal函数UNIX/Linux处理信号最常用的接口是signal函数在命令行使用kill命令,向指定进程发送信号。使用kill函数#include<signal.h>void(*signal(intsigno,void(*func)(int)))(int);参数signo是前面表格中的信号名。参数func是接到此信号后要调用的函数。该函数有个int型参数,int代表捕获到的信号值第二章捕获信号进程捕捉到信号并对信号进行处理时,进程正在执行的指令序列就被信号处理程序临时中断,它首先执行该信号处理程序中的指令。如果信号处理程序返回(没有调用exit(0)或者abort),则继续执行在捕捉到信号时进程正在执行的正常指令序列。在信号处理程序中,不能判断捕捉到信号时进程正在何处执行。第二章捕获信号voidcatch_Signal(intSign){ switch(Sign) { caseSIGINT: printf("SIGINTSignal\n"); }}intmain(intarg,char*args[]){ signal(SIGINT,catch_Signal); pause(); return0;}signal函数例子第二章捕获信号编译后执行该程序用kill命令发送信号给该程序kill命令作用其实不是‘杀死’的意思,而是将指定信号发送给指定进程。Contents信号概念
捕获信号发送信号123改进的捕获信号机制
4使用自定义信号
5守护进程(daemon)6第三章发送信号发送信号使用kill命令在命令行使用kill命令,向指定进程发送信号。使用kill函数#include<signal.h>#include<sys/types.h>intkill(pid_tpid,intsig);参数pid指定一个要杀死的进程,而sig是要发送的信号。第三章发送信号intmain(intarg,char*args[]){ if(arg>1) { intpid=atoi(args[1]); kill(pid,SIGKILL); } else { printf("pid=%u\n",getpid()); sleep(60); } return0;}kill函数例子第三章发送信号发送信号使用raise函数#include<signal.h>intraise(intsigno);kill函数将信号发送给进程,raise函数允许进程向自身发送信号;raise(signo)等价于kill(getpid(),signo)。第三章发送信号alarm函数设置了一个定时器,当定时器到了就发送SIGALRM信号。#include<unistd.h>unsignedintalarm(unsignedintseconds);seconds是计时器时间到后时钟的秒数。如果没有设置其他超时,函数返回0,否则返回值为前面安排超时中保留的秒数一个进程只能设置一次超时把seconds设置为0可以取消前面的超时设置。第三章发送信号voidcatch_Signal(intSign){ switch(Sign) { caseSIGALRM: printf("SIGALRMSignal\n"); }}intmain(intarg,char*args[]){ signal(SIGALRM,catch_Signal); alarm(1); pause(); return0;}alarm函数例子第三章发送信号abort函数。voidabort(void);该函数发送SIGABRT信号给调用进程,进程不应该忽略这个信号。即使进程捕捉到SIGABRT这个信号,进程还是会异常退出。让进程捕捉SIGABRT的意图是,在进程终止前由其执行所需的清理操作。第三章发送信号sleep函数。unsignedintsleep(unsignedintseconds);参数seconds指定了睡眠时间。超过seconds指定时间,函数返回。调用进程捕捉到一个信号并从信号处理程序返回。第三章发送信号作业控制信号。SIGCHLD-子进程已停止或终止;SIGCONT-如果进程已经停止,使其继续运行;SIGSTOP-停止信号,不能被捕捉或者忽略;SIGTTIN-后台进程组成员读控制终端;SIGTTOU-后台进程组成员写到控制终端。除SIGCHLD以外,大多数程序并不处理这些信号。Shell程序一般需要处理些信号。信号用于大多数复杂的应用程序中。理解信号处理对于Linux编程非常重要。Contents信号概念
捕获信号发送信号123改进的捕获信号机制
4使用自定义信号
5守护进程(daemon)6第四章改进的捕获信号机制sigaction函数的功能是检查或修改与指定信号相关联的处理动作,该函数取代了signal函数。#include<signal.h>intsigaction(intsigno,conststructsigaction*act,structsigaction*oact);成功返回0,失败返回-1。第四章改进的捕获信号机制参数signo是要检测或者修改其具体动作的信号编号(或同时执行这两种操作)。如果act指针非空,则要修改其动作。如果oact指针非空,则系统由oact指针返回该信号的上一个动作。
structsigaction{ void(*sa_handler)(int); void(*sa_sigaction)(int,siginfo_t*,void*); sigset_tsa_mask; intsa_flags; void(*sa_restorer)(void);}第四章改进的捕获信号机制voidcatch_Signal(intSign){ switch(Sign) { caseSIGINT: printf("SIGINTSignal\n"); exit(0); }}intsignal1(intsigno,void(*func)(int)){ structsigactionact,oact; act.sa_handler=func; sigemptyset(&act.sa_mask); act.sa_flags=0; returnsigaction(signo,&act,&oact);}intmain(intarg,char*args[]){ signal1(SIGINT,catch_Signal); pause(); return0;}sigaction函数例子Contents信号概念
捕获信号发送信号123改进的捕获信号机制
4使用自定义信号
5守护进程(daemon)6第五章使用自定义信号voidcatch_Signal(intSign){ switch(Sign) { caseSIGINT: printf("SIGINTSignal\n"); exit(0); caseSIGUSR1: printf("SIGUSR1Signal\n"); }}intmain(intarg,char*args[]){ signal(SIGINT,catch_Signal); signal(SIGUSR1,catch_Signal); printf("pid=%d\n",getpid()); while(1) { sleep(1); } return0;}捕获SIGUSR1信号发送SIGUSR1信号intmain(intarg,char*args[]){ if(arg>1) { kill(atoi(args[1]),SIGUSR1); printf("sentto%d\n",atoi(args[1])); } return0;}Contents信号概念
捕获信号发送信号123改进的捕获信号机制
4使用自定义信号
5守护进程(daemon)6第六章守护进程守护进程(daemon)。守护进程是一个后台进程,它无需用户输入就能运行,经常是提供某种服务。Linux做为服务器是,主要的进程也都是为系统或者用户提供后台服务功能。常见的守护进程有Web服务器、邮件服务器以及数据库服务器等等。守护进程不能够控制终端,所以任何输入或者输出都需要做特殊处理。第六章守护进程守护进程看上去似乎很神秘,但如果牢记几条规则而且知道几个关键函数,工作就很简单了。首先执行fork后让父进程退出。和多数程序一样,一个守护进程是从shell脚本或者命令行启动的。但守护进程和应用程序不一样,因为它们不是交互式的它们在后台因而没有控制终端。父进程在fork子进程退出后就消除了控制终端。守护进程既不需要从标准输入设备读信息,也不需要从标准输出设备输出信息。第六章守护进程下一步是在子进程中调用setsid,取消进程和任何控制终端的关联。下一步是让根目录成为子进程的当前工作目录。因为任何进程如果它的当前目录是在一个被安装的文件系统上,那么就会妨碍这个文件系统被卸载。第六章守护进程接下来设置进程的umask为0。为了避免守护进程集成的umask收到创建文件和目录操作的干扰,这一步是必要的。如果一个进程集成了父进程的umask055,他屏蔽掉了group和other的读和执行权。如果守护进程接着创建了一个文件,那么对group和other用户操作这个文件会带来麻烦。守护进程调用umask0避免了这种情况,当创建文件的时候给予守护进程更大的灵活性。第六章守护进程最后关闭子进程继承的任何不必要的文件描述符。对于子进程来说,没有理由保持从父进程继承来的打开的文件描述符。具体关闭哪些取决与具体的守护进程需要和要求,很难精确的说明规则。第六章守护进程创建守护进程步骤总结父进程中执行fork后,执行exit退出。在子进程中调用setsid。让根目录“/”成为子进程的工作目录。把子进程的umask变为0。关闭任何不需要的文件描述符。第六章守护进程setsid函数pid_tsetsid()setsid函数创建一个新会话和一个新进程组,然后守护进程成为新会话的会话领导,以及新进程组的进程组领导。setsid调用还保证新会话没有控制终端。如果调用进程已经是一个进程组的领导进程,setsid调用失败。setsid调用成功返回新会话ID,失败返回-1,并设置errno。第六章守护进程chdir函数intchdir(constchar*pathname)chdir函数根据参数pathname设置当前工作。chdir调用成功返回0,失败返回-1,并设置errno。第六章守护进程umask函数mode_tumask(mode_tmask);umask调用把守护进程的umask设置为0,这样取消了来自父进程的umask,它们能够潜在的干扰创建文件和目录。第六章守护进程创建守护进程代码例子。voidsetdaemon(){ pid_tpid,sid; pid=fork(); if(pid<0) { printf("forkfailed\n"); exit(EXIT_FAILURE); } if(pid>0) { exit(EXIT_SUCCESS);//intheparent } if((sid=setsid())<0) { printf("setsidfailed\n"); exit(EXIT_FAILURE); } if((chdir("/"))<0) { printf("chdirfailed\n"); exit(EXIT_FAILURE); } umask(0); //close(STDIN_FILENO);//ifclosestdin,thendaemon_consolefailed close(STDOUT_FILENO); close(STDERR_FILENO);}第六章守护进程一旦系统调用setsid,它就不再有控制终端。可以通过syslog提供服务,记录守护进程的各种输出信息。第六章守护进程openlog函数打开日志,syslog写入日志,closelog关闭日志。#include<syslog.h>voidopenlog(constchar*ident,intoption,intfacility);voidsyslog(intpriority,constchar*format,...);voidcloselog(void);第六章守护进程openlog函数发起到系统日志服务器的连接,参数ident是要向每个消息加入的字符串,典型的情况是要设置成程序的名称。参数option是下面一个或多个值的“或”名称含义LOG_CONS如果系统日志服务器不能用,写入控制台LOG_NDELAY立即打开连接,正常情况下,直到发送第一条消息才打开连接LOG_PERROR打印输出到stderrLOG_PID每条消息中包含进程PID第六章守护进程参数facitity指定程序发送消息的类型。名称含义LOG_AUTHPRIV安全授权消息LOG_CRON时钟守护进程:cron和atLOG_DAEMON其他系统守护进程LOG_KERN内核消息LOG_LPR打印机子系统LOG_MAIL邮件子系统LOG_USER默认第六章守护进程参数priority指定消息的重要性。名称含义LOG_EMERG系统不能使用LOG_ALERT立即采取措施LOG_CRIT紧急事件LOG_ERR出错条件LOG_WARNING警告条件LOG_NOTICE正常但重大事件LOG_INFO信息消息LOG_DEBUG调试信息第六章守护进程syslog代码例子:syslog(LOG_INFO,"mydaeminisOK");严格的说,openlog和closelog是可选的,因为函数syslog在首次使用的时候自动打开日志文件。linux系统上日志文件通常是/var/log/messages。第六章守护进程要和一个守护进程通信,你要向它发送信号,让它以某种方式相应。例如:强行要求一个守护进程重新读取它的配置文件,或者改变守护进程的行为,或者指示守护进程结束运行。第六章守护进程使用信号与守护进
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 奢侈品知识培训课件图片
- 2025年法律知识竞赛抢答题库及答案(共70题)
- 急诊科急救知识培训课件
- 农业节水灌溉项目投资与建设管理协议
- 企业级内容管理系统实施协议
- 江苏省宿迁市宿城区2024-2025学年八年级上学期期末生物学试题(含答案)
- 中国历史绘本读后感
- 水电站投资合同
- 私人手车买卖合同
- 新型健康技术产品销售及市场合作合同
- YY/T 1860.1-2024无源外科植入物植入物涂层第1部分:通用要求
- 中央2025年全国妇联所属在京事业单位招聘93人笔试历年参考题库附带答案详解
- 人教版高中物理选择性必修第二册电磁波的发射与接收课件
- 《建筑冷热源》全册配套最完整课件1
- 广州2025年广东广州市番禺区小谷围街道办事处下属事业单位招聘5人笔试历年参考题库附带答案详解
- 封条模板A4直接打印版
- 微差爆破施工方案
- 同一直线上的二力合成导学案
- 2022年度八年级美术抽测题库
- 义务教育《地理》课程标准(2022年版)
- 单细胞蛋白论文
评论
0/150
提交评论