实验七 信号
Posted 18041528
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了实验七 信号相关的知识,希望对你有一定的参考价值。
1.编写一个简单的程序并运行,然后向该进程发送不同的信号以观察该进程对接收到信号的反应。
(1)在当前终端通过按键组合向该进程发送信号 CTRL+C、CTRL+Z、CTRL+\\ 观察三种信号及其对应的进程反应
(2)另外再开启一个终端,在终端通过输入 kill 命令来给进程发送信号,进程的 pid 在程序运行的第一行输出。在终端通过输入 kill -l 来查看当前系统当中的信号列表
(3)编写一个简单的程序,该程序调用 kill() 函数向某个进程发送信号
2.使用 signal() 函数来捕捉信号。
signal()函数帮助手册
运行程序后依次按下CTRL+C,CTRL+Z,CTRL+\\,并在另一个终端中使用不同kill选项
3.通过举例说明 alarm() 函数和 setitimer() 函数的使用。
这里我们通过命令 man 7 signal 可以查看当前系统信号的清单:
从上面可以看到 alarm() 函数在计时结束后会发生 SIGALRM 信号给当前进程,进程对 SIGALRM 信号的
缺省动作是结束进程。
设置定时炸弹:
setitimer()函数:
试分析一下 alarm() 函数和 setitimer() 函数的区别?
alarm()函数,当定时时间到了,就会产生SIGALRM信号结束进程。
setitimer()函数从开始计时到时间结束,会产生SIGALRM信号,若是ITIMER_REAL为1则不会重新启动该定时器,调用 setitimer()失败,返回-1,结束进程。
4.举例说明信号集操作函数的使用
5.举例说明对阻塞信号与未决信号的理解
6.举例说明 sigaction() 函数的使用
在一个进程中,保存了两个信号集(在PCB中),分别是阻塞信号集,还有一个未决信号集。当你使用
sigprocmask 的时候,就会修改阻塞信号集。
当你的进程一收到信号且该信号被阻塞,它首先进入到未决信号集中(就是一个 sigset_t ),当未决
信号集中的信号被信号处理函数(你自己定义的或者系统默认的)处理,就会从未决信号集中删除。
如果一个信号加入阻塞信号集,该信号的信号处理函数就不会被调用。
man sigprocmask
man sigpending
(1) 当程序运行的时候,Ctrl+C 进入 handler ,然后立即 Ctrl+Z 发现handler还未执行完就被SIGTSTP打断.
(2) 当程序运行的时候,Ctrl+Z 进入 handler ,然后立即 Ctrl+C 发现并不会被 SIGINT 打断,
handler 结束的时候打印了未决信号集,发现里头有 SIGINT,所以 handler 结束后,又去继续对 SIGINT 进行处理
以上是关于实验七 信号的主要内容,如果未能解决你的问题,请参考以下文章