第6单元 信号_第1页
第6单元 信号_第2页
第6单元 信号_第3页
第6单元 信号_第4页
第6单元 信号_第5页
已阅读5页,还剩16页未读 继续免费阅读

下载本文档

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

文档简介

1、Linux系统编程第6单元信号2第6单元 信号n6.1 信号概念n6.2 信号的产生n6.3 信号的响应n6.4 信号集n6.5 信号阻塞信号概念n信号:软中断,被发送给一个正在执行的进程,通知该进程有某一特定事件发生。通常用于异步事件处理。n每个信号都有一个名字,以SIG开头kill l查看信号值man 7 signal查看信号详细信息/usr/include/bits/signum.hn每个信号都被定义为一个正整数。0信号被认为是空信号,kill可以向进程发送0信号,以此判断进程是否存在。3信号概念n信号产生后通过内核发给某个进程,进程收到信号后可以选择对信号忽略、捕捉或执行系统默认动作。

2、大多数信号的默认动作是终止当前进程。4信号名信号名值值说明说明缺省动作缺省动作SIGINT2中断Ctrl+c终止SIGKILL9终止进程,不可阻塞、捕捉、忽略终止SIGTERM15终止进程,可阻塞、捕捉、忽略终止SIGALRM14超时终止SIGUSR212用户自定义信号终止5信号的产生n信号来自内核,生成信号的请求通常来自:用户按某些终端键或执行命令n如Ctrl-C(SIGINT)等按键来请求内核产生信号。n调用kill命令结束进程,如“kill pid”默认发送SIGTERM信号。硬件异常n除0(SIGFPE),无效的内存访问(SIGEGV)等。进程执行kill函数n给其他进程或进程组发送信

3、号,进程间通信。 n发送信号权限:root权限进程可将信号发给任一进程,普通用户权限进程仅能向同一用户的进程发送信号。软件条件nalarm函数,管道读进程终止写进程会接收SIGPIPE信号等。6信号的响应n进程接收到信号后,可以有三种响应方式不做特殊处理执行系统默认动作,每个信号都有默认动作,大多数都是终止进程。忽略,需要调用signal/sigaction设置n有两种信号不能被忽略,SIGKILL和SIGSTOP。捕捉,需要调用signal/sigaction设置n通知内核在某种信号发生时调用一个用户函数。在用户函数中,可执行用户希望对这种事件进行的处理,n有两种信号不能被阻塞,SIGKIL

4、L和SIGSTOP。nSIGKILL和SIGSTOP这两种信号不能被忽略的原因是:它们向超级用户提供一种使进程终止或停止的可靠方法。7signal设置信号响应方式n#include void (* signal (int signum, void (*handler)(int) (int);功能:指定signum信号的处理函数为handler。signum:信号值handler:n执行系统默认动作:SIG_DFLn忽略:SIG_IGN n捕捉:handler是参数为int,返回值为void的信号处理函数。参数int为捕捉到的信号值返回值:n成功上次对该信号的处理函数地址,失败返回SIG_ERR

5、注意:SIGKILL与SIGSTOP不可忽略与捕捉8signal举例n对值为n的某信号进行处理可以采用忽略nsignal(n,SIG_IGN)执行系统默认动作nsignal(n,SIG_DFL)捕捉后执行其他函数nsignal(n, handler )nhandler函数原型要求:void (*handler)(int)9signal举例n一个程序20次循环显示hello,每次间隔1s。n设置对信号SIGINT(ctrl+c发送)和SIGUSR1(kill命令发送)进行三种不同的处理:默认、忽略、捕捉(信号处理函数显示Im here及信号值)n程序执行过程中按ctrl+c看设置后的效果nP24

6、1 程序10-1nP249 程序10-3 捕捉SIGCHLD信号10kill发送信号 P251#include nint kill(pid_t pid, int signum);功能:向pid进程发送信号signum参数:npid0:发给pid进程 npid=0:发给与发送进程同一进程组的所有进程。npid0:发给进程组号为|pid|的所有进程,且发送进程对该进程具有发送信号权限。npid=-1:发给所有进程,且发送进程对该进程具有发送信号权限。返回值:成功返回0,错误返回-1。nraise(signum)=kill(getpid(),signum)11alarmn#include unsig

7、ned int alarm(unsigned int seconds);功能:调用后,seconds秒后对本进程发送一个SIGALRM信号,该信号默认动作是终止调用进程。参数:seconds代表秒数。返回值:0或上一个alarm定时器剩余的秒数。说明:一个进程只能设置一个alarm报警时钟。再次调用alarm时如果前一个还没到报警时间则前一个自动被关闭,当前的alarm返回前一个剩余的时间。12alarm与sleepnsleep阻塞等待,其后语句暂不执行nalarm非阻塞等待,其后语句继续执行,要想捕捉SIGALRM信号,需要调用pause( )函数挂起进程直至捕捉到一个信号,否则可能直到ma

8、in函数执行完SIGALRM信号还未到达。nP253 程序10-4,实现简单的sleep程序10-7,具有超时限制的read13信号的阻塞与信号集n有时既不希望进程接到信号立即中断当前执行,也不希望信号被忽略掉,而是延迟一段时间去调用信号处理函数。这就可以通过阻塞信号的方法实现。n每个进程都有一个信号屏蔽字(signal umask),用来保存即将被阻塞的信号。信号忽略:系统仍然传递该信号,只是相应进程对该信号不作任何处理而已。信号阻塞:系统不传递该信号,显示该进程无法接收到该信号直到进程的信号集发生改变。n信号集通常用于进程对信号的阻塞操作。使用方法:准备好进程的信号集,调用sigprocm

9、ask设置进程的信号屏蔽字。14信号集n信号集代表由多个信号所组成集合的一种数据类型sigset_t类型,按位代表最多1024个信号ntypedef _sigset_t sigset_t;n# define _SIGSET_NWORDS (1024 / (8 * sizeof (unsigned long int)typedef struct unsigned long int _val_SIGSET_NWORDS; _sigset_t;15信号集操作n信号集是按位进行设置相应信号的,不方便,所以提供一套信号集操作函数设置信号集的值int sigemptyset(sigset_t *set);

10、n清空信号集,不包含任何信号int sigfillset(sigset_t *set); n设满信号集,包含所有信号int sigaddset(sigset_t *set, int signum) ;n将signum信号加入信号集int sigdelset(sigset_t *set, int signum); n将signum信号从信号集中删除int sigismember(const sigset_t *set, int signum);n判断signum是否属于set信号集16信号集用于信号的阻塞n设置信号屏蔽字来完成信号的阻塞nint sigprocmask(int how, cons

11、t sigset_t *set, sigset_t *oldset); How:做什么操作 SIG_BLOCK /添加信号屏蔽字,set与原屏蔽字逻辑或 SIG_UNBLOCK /去掉部分信号,set与原屏蔽字逻辑减 SIG_SETMASK /替换信号屏蔽字,set对原屏蔽字进行赋值set:新信号集的指针,为NULL表明仅想读取当前信号屏蔽字oldset:存放原来信号集的指针n返回值:成功返回0。失败返回-1(置errno)nP259 程序10-10 为进程打印信号屏蔽字nP260程序10-11 设置信号屏蔽字sigaction函数nint sigaction(int signo, const

12、 struct sigaction * restricct act, struct sigaction *restrict oact);n参数:signo信号值act:如果act非空,则修改对signo的响应方式oact:如果oact非空,则oact将返回对signo信号的上一次响应方式。n返回值:成功返回0,失败返回-117sigaction函数struct sigactionstruct sigaction void (*sa_handler)(int); /响应方式:SIG_IGN或SIG_DFL或函数名 sigset_t sa_mask; /信号集,在捕捉信号之前,将其加入信号屏蔽字中

13、,当信号捕捉函数返回值再将信号屏蔽字复位。保证处理一个给定信号时,如果该信号再次发生,不会丢失。 int sa_flags; /一些信号选项,见P262表10-5 void (*sa_sigaction)(int, siginfo_t *, void *);/可替代信号处理程序,仅当sa_flags为SA_SIAINFO标志时,用其替换sa_handler成员。并且此时信号处理程序的参数要增加为3个:信号值int,信号产生原因有关信息struct siginfo,标识信号传递时进程的上下文ucontext_t。;P265 程序10-12 用sigaction实现的signal函数18sigac

14、tionstruct sigaction- siginfostruct siginfo int si_signo; /* signal number */ int si_errno; /* if nonzero, errno value from */ int si_code; /* additional info (depends on signal) */ pid_t si_pid; /* sending process ID */ uid_t si_uid; /* sending process real user ID */ void *si_addr; /* address that caused the fault */ int si_status; /* exit value or signal number */ long si_band; /* band number for SIGPOLL */ /* possibly other fields also */ ;19sigaction举例void sig_handler_with_arg(int sig,siginfo_t *sig_info,void *unused)int main(int argc,char *argv)struct sigaction sig_act, oact;sigem

温馨提示

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

评论

0/150

提交评论