linux信号与系统调用的关系

linux信号与系统调用的关系

ID:20344364

大小:47.50 KB

页数:7页

时间:2018-10-09

linux信号与系统调用的关系_第1页
linux信号与系统调用的关系_第2页
linux信号与系统调用的关系_第3页
linux信号与系统调用的关系_第4页
linux信号与系统调用的关系_第5页
资源描述:

《linux信号与系统调用的关系》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库

1、信号与系统调用的关系:当一个进程正在执行一个系统调用时,如果向该进程发送一个信号,那么对于大多数系统调用来说,这个信号在系统调用完成之前将不起作用,因为这些系统调用不能被信号打断。但是有少数几个系统调用能被信号打断,例如:wait(),pause()以及对慢速设备(终端、打印机等)的read()、write()、open()等。如果一个系统调用被打断,它就返回-1,并将errno设为EINTR。可以用下列代码来处理这种情况:if(wirte(tfd,buf,SIZE)<0){if(errno==EINTR){warn(“Writeinterrupted.”);……}}信号的复位

2、:在Linux中,当一个信号的信号处理函数执行时,如果进程又接收到了该信号,该信号会自动被储存而不会中断信号处理函数的执行,直到信号处理函数执行完毕再重新调用相应的处理函数。下面的程序演示了这一点:#include#includeintcatch(intsig);//信号绑定函数,必须在main函数前声明。intmain(void){printf("theprogramisstarting.");signal(SIGINT,catch);//接受到SIGINT信号,执行绑定的catch函数//signal(SIGINT,SIG_DFL)

3、;//SIG_DFL恢复成系统的缺省动作//signal(SIGINT,SIG_IGN);//告诉进程将SIGINT信号忽略,CTRL+Csleep(10);printf("theend.");return0;}intcatch(intsig){printf("Interruptcalled.");sleep(4);printf(“InterruptFuncend.”);}执行它,结果如下:theprogramisstarting.InterruptcalledInterruptFuncend.InterruptcalledInter

4、ruptFuncend.theend只能保存一个CTRL+C。如果在信号处理函数执行时进程收到了其它类型的信号,该函数的执行就会被中断:theprogramisstarting.InterruptcalledQuitcalledQuitended.InterruptFuncend。theended.在进程间发送信号:个进程通过对signal()的调用来处理其它进程发送来的信号。一个进程也可以向其它的进程发送信号。这一操作是由系统调用kill()来完成的。kill()在linux系统库signal.h中的函数声明:intkill(pid_tpid,

5、intsig);参数pid指定了信号发送的对象进程:它可以是某个进程的进程标识符(pid),也可以是以下的值:如果pid为零,则信号被发送到当前进程所在的进程组的所有进程;如果pid为-1,则信号按进程标识符从高到低的顺序发送给全部的进程(这个过程受到当前进程本身权限的限制);如果pid小于-1,则信号被发送给标识符为pid绝对值的进程组里的所有进程。需要说明的是,一个进程并不是向任何进程均能发送信号的,这里有一个限制,就是普通用户的进程只能向具有与其相同的用户标识符的进程发送信号。也就是说,一个用户的进程不能向另一个用户的进程发送信号。只有root用户的进程能够给任何线程发送

6、信号。参数sig指定发送的信号类型。它可以是任何有效的信号。由于调用kill()的进程需要直到信号发往的进程的标识符,所以这种信号的发送通常只在关系密切的进程之间进行,比如父子进程之间。下面是一个使用kill()调用发送信号的例子。这个程序建立两个进程,并通过向对方发送信号SIGUSR1来实现它们之间的同步。这两个进程都处于一个死循环中,在接收对方发送的信号之前,都处于暂停等待中。这是通过系统调用pause()来实现的,它能够使一个程序暂停,直至一个信号到达,然后进程输出信息,并用kill发送一个信号给对方。当用户按了中断键,这两个进程都将终止。#include

7、h>intntimes=0;main(){intpid,ppid;intp_action(),c_action();/*设定父进程的SIGUSR1*/signal(SIGUSR1,p_action);switch(pid=fork()){case-1:/*fork失败*/perror("synchro");exit(1);case0:/*子进程模块*//*设定子进程的SIGUSR1*/signal(SIGUSR1,c_action);/*获得父进程的标识符*/ppid=getppid();f

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。