实验七 信号
实验七 信号
| 项目 | 内容 |
|---|---|
| 属于哪个课程 | 班级地址 |
| 作业要求在哪 | 作业要求 |
| 学号-姓名 | 170041522-谢卢平 |
| 作业目标 | 1、了解信号的概念 2、掌握信号处理的方法 |
1、编写一个简单的程序并运行,然后向该进程发送不同的信号以观察该进程对接收到信号的反应。
程序:

编译并运行:
(1)、通过按键组合发送信号
按下CTR L+C:
按下CTR L+Z:
按下CTR L+:
(2)、通过kill命令来发送命令
再开一个终端,确认pid
又开一个终端,输入kill:
切回上一个终端,查看结果:
(3)、编写程序调用kill()函数发送信号
运行之前的程序:
另开一个终端,输入并编译运行下列程序:

编译运行:
结果:
2、使用signal()函数来捕捉信号。
程序:


结果:
在另一个终端输入kill命令向终端发送信号:
3、通过举例说明alarm()函数和setitimer()函数的使用。
程序:
#include<stdio.h>
#include<stdlib.h>
#include<unistd.h>
int main(){
alarm(1);
while(1);
{
printf("process will finish!\n");
}
return 0;
}
结果:

虽然程序中有无限循环,不断输出字符串 process will finish! ,由于调用了 alarm(1) 函数,alarm 函数会在1秒后给该进程发送 SIGALRM 信号,然后进程结束。
接下来继续看一个程序设定了两次定时炸弹,第一次设定 5 秒后爆炸,设定后过了 2 秒,再设定了一个3 秒后爆炸的定时炸弹。
程序:

结果:

使用setitimer()函数实现alarm()函数
程序:

结果:

4、举例说明信号集操作函数的使用。
程序:

结果:

5、举例说明对阻塞信号与未决信号的理解。
程序:


结果:


6、举例说明sigaction()函数的使用。
程序:


结果:

当程序运行的时候, Ctrl+C 进入 handler ,然后立即 Ctrl+Z 发现 handler 还未执行完就被SIGTSTP 打断.
当程序运行的时候, Ctrl+Z 进入 handler ,然后立即 Ctrl+C 发现并不会被 SIGINT 打断,这是因为该 handler 注册的时候被设置了 SA_MASK = SIGINT 。最后 handler 结束的时候打印了未决信号集,发现里头有 SIGINT 。所以 handler 结束后,又去继续对 SIGINT 进行处理。
浙公网安备 33010602011771号