进程的通信(中断的模拟)-操作系统实践二

自建个人博客:34.96.139.59

进程的通信(中断的模拟)-操作系统实践二

1、实验目的
(1)信号机制是进程之间互相传递消息的一种方法,信号也称软中断信号,可以实现内核
或其他进程对某个进程实现中断。
(2)使用signal函数实现用户自定义的信号处理程序,用信号处理来模拟操作系统的中断
功能,本实验以SIGINT信号为例。
2、实验环境
Red Hat 企业版 Linux 6.3;VMware虚拟机
3、预备知识
(1)signal函数
#include “signal.h’
sighandler_t signal ( int signum , sighandler_t handler ) ;
signum:要处理的信号类型,可取除了SIGKILL和SIGSTOP之外的所有信号;
handler:表示对该信号的处理方式
(2)信号的三种处理方式
忽略、捕捉并调用自定义处理函数、缺省处理
(3)信号SIGINT
程序终止信号,由InterruptKey产生,通常为Ctrl +C或Delete,通知前台进程组
终止进程。
(4)信号SIGQUIT
程序终止信号,通常为Ctrl +\。
4、实验内容
编写程序,验证Linux提供的系统调用signal( )函数,接收到的信号为SIGINT;
1)采用忽略处理,按Ctrl+C无效,只能按Ctrl +\退出。
(SIG_IGN:这个符号表示忽略该信号。)
进程的通信(中断的模拟)-操作系统实践二

#include <stdio.h>
#include <signal.h>
int main(int argc, char *argv[]) {
signal(SIGINT, SIG_IGN);
while(1);
return 0;
}
2)采用系统的默认处理,按Ctrl+C退出。
(SIG_DFL:这个符号表示恢复对信号的系统默认处理。不写此处理函数默认也是执行系统默认操作。)
进程的通信(中断的模拟)-操作系统实践二

#include<stdio.h>
#include<signal.h>
int main(){
signal(SIGINT,SIG_DFL);
while(1);
return 0;
}
或是
#include<stdio.h>
#include<signal.h>
int main(){
signal(SIGINT,0);//任何数值都行
while(1);
return 0;
}
3)执行自定义的信号处理函数。该函数每接收到一次键位信号就输出字符串”catch signal%d\n” ,(%d对应信号的值),按Ctrl +\可退出程序。
自定义处理函数 void
进程的通信(中断的模拟)-操作系统实践二
#include<stdio.h>
#include<signal.h>
static int a[32]={0};
void signal_handler_fun(int signum){
a[signum]++;
printf("\ncatch signal %d,this is %d time\n",signum,a[signum]);
}

int main(){
signal(SIGINT,signal_handler_fun);
while(1);
return 0;