信号
项目 | 内容 |
---|---|
这 个 作 业 属 于 哪 个 课 程 | 班 级 地 址 |
这个作业要求在哪里 | 作 业 要 求 地 址 |
学号-姓名 | 17041506-张政 |
学习目标 | 1.了解信号的概念 2.掌握信号处理的方法 |
1.编写一个简单的程序并运行,然后向该进程发送不同的信号以观察该进程对接收到信号的反应。
- 代码如下:
- 在终端1中运行代码,并分别向该进程发送信号 CTRL+C 、 CTRL+Z 、 CTRL+\ ,观察进程的反应。
如图1:
- 在终端2中输入
kill -l
观察当前信号列表,并运行hellosignal文件
如图2:
- 得到pid3344后,在终端3输入
kill -9 3344
,查看终端2的进程反应
如图3:
如图4:
- 注:推篇kill命令的博客。有个很有意思——init进程(硬件狗突然想到了“watchdog”),感兴趣可以自己去看看。
- 来试试调用kill函数吧,代码如下:
如图5:
- 在终端1运行hellosignal,得3245
如图6:
- 在终端2运行mykill,并输入3245,查看终端1结果
如图7:
如图8:
2.使用signal()
函数来捕捉信号。
- 创建catchsignal文件,输入代码如下:
图1:
- 终端1运行catchsignal,分别输入 CTRL+C 、 CTRL+Z 、 CTRL+\ ,观察进程的反应。得到3520。
如图2:
- 终端2输入如下kill命令
如图3:
- 终端1查看结果
如图4:
3.通过举例说明alarm()
函数和setitimer()
函数的使用。
- 使用
alarm
函数,代码如下:
如图1:
- alarm_test运行就是打印
process will finish!
,一秒后停止 - 运行如下:
如图2:
- 使用
setitimer()
函数,代码如下:
如图3:
- 运行如下:
如图4:
alarm()
函数和setitimer()
函数的区别
alarm()用来设置信号SIGALRM在经过参数seconds指定的秒数后传送给目前的进程。如果参数seconds为0,则之前设置的闹钟会被取消,并将剩下的时间返回。
setitimer()支持3种类型的定时器:(1)ITIMER_REAL : 以系统真实的时间来计算,它送出SIGALRM信号。(2)ITIMER_VIRTUAL : -以该进程在用户态下花费的时间来计算,它送出SIGVTALRM信号。(3)ITIMER_PROF : 以该进程在用户态下和内核态下所费的时间来计算,它送出SIGPROF信号。调用成功返回0,否则返回-1
4.举例说明信号集操作函数的使用。
- 编写一个打印 sigset_t 的函数,后通常该函数查看,信号集操作函数对信号集操作后的结果。代码如下:
如图1:
- 运行结果:
如图2:
5.举例说明对阻塞信号与未决信号的理解。
- 程序思路是先把 SIGINT 、 SIGTSTP 加入到了进程阻塞信号集中去。接下来,每隔一秒打印一次未决信号集,第 10 次的时候,又把 SIGINT 信号从阻塞信号集中删除。代码如下:
如图1:
- 运行,分别发送信号 CTRL+C 、 CTRL+Z 、 CTRL+\ ,观察,再在终端2输入
kill -9 -33922
结果:
如图2:
6.举例说明sigaction()
函数的使用。
- 代码如下:
如图1:
- (1) 当程序运行的时候, Ctrl+C 进入 handler ,然后立即 Ctrl+Z 发现 handler 还未执行完就被 SIGTSTP 打断。(2) 当程序运行的时候, Ctrl+Z 进入 handler ,然后立即 Ctrl+C 发现并不会被 SIGINT 打断,这是因 为该 handler 注册的时候被设置了 SA_MASK = SIGINT 。最后 handler 结束的时候打印了未决信号集,发现里头有 SIGINT 。所以 handler 结束后,又去继续对 SIGINT 进行处理。运行结果:
如图2: