APUE学习---信号.doc
上传人:sy****28 上传时间:2024-09-10 格式:DOC 页数:9 大小:115KB 金币:16 举报 版权申诉
预览加载中,请您耐心等待几秒...

APUE学习---信号.doc

APUE学习---信号.doc

预览

在线预览结束,喜欢就下载吧,查找使用更方便

16 金币

下载此文档

如果您无法下载资料,请参考说明:

1、部分资料下载需要金币,请确保您的账户上有足够的金币

2、已购买过的文档,再次下载不重复扣费

3、资料包下载后请先用软件解压,在使用对应软件打开

HYPERLINK"http://blog.csdn.net/ymanmeng123/article/details/8968188"APUE学习--信号(1)分类:HYPERLINK"http://blog.csdn.net/ymanmeng123/article/category/1425904"Unix环境编程2013-05-2410:2231人阅读HYPERLINK"http://blog.csdn.net/ymanmeng123/article/details/8968188"\l"comments"评论(0)HYPERLINK"javascript:void(0);"\o"收藏"收藏HYPERLINK"http://write.blog.csdn.net/postedit/8968188"\o"编辑"编辑HYPERLINK"javascript:void(0);"\o"删除"删除HYPERLINK"http://blog.csdn.net/tag/details.html?tag=%e7%bc%96%e7%a8%8b"\t"_blank"编程HYPERLINK"http://blog.csdn.net/tag/details.html?tag=APUE"\t"_blank"APUEHYPERLINK"http://blog.csdn.net/tag/details.html?tag=Linux"\t"_blank"LinuxHYPERLINK"http://blog.csdn.net/tag/details.html?tag=%e4%bf%a1%e5%8f%b7"\t"_blank"信号先说下什么是中断?由硬件产生,产生后由软件立即去执行某种操作那么什么是信号呢?可以把信号理解为软中断,也就是说信号的产生也是由软件,并由软件立即去执行某种操作。我们这里说的信号是进程中的语义,针对的对象都是进程。信号是一种处理异步事件的方法,所谓异步,你能知道当xxx事件发生时应该执行什么样的操作,但不知道xxx事件何时会发生。Linux系统为我们进程提供了多大64个信号,其中前32个是不可靠信号(我比较原意称其为非实时信号),后面的是可靠信号(实时信号),可以通过kill-l命令在终端中查看信号的列表,每个信号使用一个整型数表示(当然有相应的宏定义方便我们记忆)。信号是如何产生的?可以是来自终端的按键(如ctrl+c终止进程ctrl+\退出进程等等)、执行过程中发生硬件异常(除数为0段错误等)、使用kill()函数向某个进程发送信号、在终端使用kill命令向某个进程发送信号、发送某个定义的软件条件(如闹钟子进程退出等)。信号的产生有了,那软终端发送后,应再由软件立即去执行某种操作,那可以是什么操作呢?当信号发送后,会立即执行该信号的处理动作,每个信号的处理动作都可以不同,处理方式包括:系统提供的默认动作(默认动作可以查看APUE这本圣经或者上度娘上很容易找到)、忽略信号什么也不做、捕捉该信号并去执行一个自定义的函数(这个行为称为注册一个信号处理函数)。那如何为信号设置处理动作?最简单的方法是使用signal()函数:[cpp]HYPERLINK"http://blog.csdn.net/ymanmeng123/article/details/8968188"\o"viewplain"viewplainHYPERLINK"http://blog.csdn.net/ymanmeng123/article/details/8968188"\o"copy"copytypedefvoid(*sighandler_t)(int);sighandler_tsignal(intsigno,sighandler_thandler);先从参数看起,第一个参数是一个整型的信号编号,是为哪一个信号设置处理动作;第一个参数的类型是一个指向参数为int无返回值的函数的函数指针;这个就是我们要为signo信号注册动作,三种处理方式分别对应的是SIG_DFLSIG_IGN和一个自定义的函数地址。这样我们就改变了一个信号的处理动作,再看返回值,类型是一个相同类型的函数指针,可以很容易推测出应该是signo信号更改之前的处理动作,也就是说可以通过返回值来保存更改之前的动作,当然如果函数执行失败,讲返回SIG_ERR。这里需要注意的是,signal()仅仅是一个注册功能的函数,除了注册意外不做任何其他的事情,注册后,当信号产生时进程会自动执行注册的动作。整个过程是这样的:当信号到来时,程序从执行位置暂停,去执行该信号的处理动作,处理动作执行完毕后(如果动作不会使进程退