实验七 信号

实验七 信号

项目 内容
属于哪个课程 班级地址
作业要求在哪 作业要求
学号-姓名 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 进行处理。

posted @ 2020-05-23 10:17  开天创世  阅读(133)  评论(0)    收藏  举报