实验七、信号

实验七 信号

项目 内容
这个作业属于哪个课程 <2020春季Linux系统与应用 >
这个作业的要求在哪里 <信号 >
学号-姓名 17041423吴金森
作业学习目标 1.了解信号的概念 2.掌握信号处理的方法

1.编写一个简单的程序并运行,然后向该进程发送不同的信号以观察该进程对接收到信号的反应。

(1)在当前终端通过按键向该进程发送信号 CTRL+C 、 CTRL+Z 、 CTRL+\ 。


(2)另外再开启一个终端,在终端通过输入 kill 命令来给进程发送信号,我们可以在终端通过输入 kill -l 来查看当前系统当中的信号列表:


(3)我们编写一个简单的程序,该程序调用 kill()函数向进程发送信号,在另一个终端完成程序的编译

2.使用signal()函数来捕捉信号。
通常进程在接收到某种信号后,会根据不同的信号执行默认的操作:
忽略信号
终止(杀死)进程
产生核心转储文件,同时 终止进程
停止进程
恢复之前被暂停的进程继续运行
这里我们可以 通过signal() 来改变进程对某个信号的处置方式。




3.通过举例说明alarm()函数和setitimer()函数的使用。
(1)alarm()函数



接下来继续设计一个程序设定两次定时炸弹,第一次设定 5 秒后爆炸,设定后过了 2 秒,再设定了一个 3 秒后爆炸的定时炸弹。


(2)setitimer()函数



4.举例说明信号集操作函数的使用。



5.举例说明对阻塞信号与未决信号的理解。
#include <stdio.h>
#include <unistd.h>
#include <signal.h>
#include <stdlib.h>
void printsigset(const sigset_t *set)
{
int i;
for (i = 1; i <= 64; i++) {
if (i==33)
putchar(' ');
if (sigismember(set, i) == 1)
putchar('1');
else
putchar('0');
}
puts("");
}

void handler(int sig) {
if (sig == SIGINT)
printf("hello SIGINT\n");
if (sig == SIGQUIT)
printf("hello SIGQUIT\n");
}

int main() {
printf("I'm %d\n", getpid());

sigset_t st, oldst;
sigemptyset(&st);
sigaddset(&st, SIGINT);
sigaddset(&st, SIGTSTP);
sigprocmask(SIG_BLOCK, &st, &oldst);
printf("new set:");
printsigset(&st);
printf("old set:");
printsigset(&oldst);

if (SIG_ERR == signal(SIGINT, handler)) {
	perror("signal SIGINT");
	return 1;
}

if (SIG_ERR == signal(SIGQUIT, handler)) {
	perror("signal SIGQUIT");
	return 1;
}

puts("");

int n = 0;

while(1) {
	sigpending(&st);
	printsigset(&st);
	puts("");
	sleep(1);
	
	if (n == 10) {
		sigset_t tmp;
		sigemptyset(&tmp);
		sigaddset(&tmp, SIGINT);
		sigprocmask(SIG_UNBLOCK, &tmp, NULL);
	}  
	
	++n;
}
return 0;

}





6.举例说明sigaction()函数的使用。

#include <stdio.h>
#include <unistd.h>
#include <signal.h>
void printsigset(const sigset_t *set)
{
int i;
for (i = 1; i <= 64; i++) {
if (i==33)
putchar(' ');
if (sigismember(set, i) == 1)
putchar('1');
else
putchar('0');
}
puts("");
}

void handler(int sig) {
if (sig == SIGTSTP)
printf("hello SIGTSTP\n");
if (sig == SIGINT)
printf("hello SIGINT\n");
sleep(5);
sigset_t st;
sigpending(&st);
printsigset(&st);
}

int main() {
printf("I'm %d\n", getpid());
struct sigaction act, oldact;
act.sa_handler = handler;

sigemptyset(&act.sa_mask);
sigaddset(&act.sa_mask, SIGINT);
act.sa_flags = 0;

sigaction(SIGTSTP, &act, &oldact);
sigaction(SIGINT, &act, &oldact);

while(1) {
	write(STDOUT_FILENO, ".", 1);
	pause();
}
return 0;

}

posted @ 2020-06-14 11:13  叫我森哥哥  阅读(140)  评论(0)    收藏  举报