【Linux实验】软中断通信
创始人
2024-01-22 16:19:09

实验目的:
1.了解什么是信号,熟练掌握signal(),wait(),exit(),kill()函数。
2.熟悉并掌握Linux系统中进程之间采用软中断通信的基本原理。

在这里插入图片描述

其中用到的Linux系统函数文章末尾有讲解

在这里插入图片描述

# include
# include
# include
# include
#include
int wait_mark;
void waiting(){while(wait_mark!=0);}
void stop(){wait_mark=0;}
int main()
{ int  p1, p2;signal(SIGINT,stop); //signal()初始位置while((p1=fork())==-1);if(p1>0)
{  while((p2=fork())==-1);if(p2>0){ wait_mark=1;waiting( );      wait(0);wait(0);printf("parent process is killed!\n");exit(0);}else {wait_mark=1;waiting( );lockf(1,1,0);printf("child  process 2 is killed by parent!\n");lockf(1,0,0);exit(0);}} else{wait_mark=1;    waiting( );lockf(1,1,0);printf("child  process 1 is killed by parent!\n");lockf(1,0,0);exit(0);}
}
  • 用 gcc 编译后再 ./ +文件名 运行即可
  • 键盘输入信号 CRTL+C 得到下图运行结果:

在这里插入图片描述

结果分析:

  1. 系统调用signal( )进行预置,让父进程捕捉由键盘发来的中断信号,当系统捕捉到中断信号后,调用预置的stop函数,子进程捕捉到信号后,输出信息终止,(child1、child2输出顺序不定。)父进程等待两个子进程结束后,也输出信息终止。
  2. 父进程用了两个wait(0)的原因:等待2个子进程都结束再执行。
  3. 每个进程退出时都用了语句exit(0)的原因:正常运行程序并退出程序。为了保证每个进程执行完后,shell能及时回收资源。

拓展:

        修改并调试程序,增加语句signal(SIGINT,SIG_IGN)和语句signal(SIGQUIT,SIG_IGN),再观察程序执行时屏幕上出现的现象,并分析其原因。注意:实验前先用kill命令查询本机用户自定义信号的编号。

       程序主要功能:子进程屏蔽外部中断信号(Ctrl-C);父进程接收用户按Ctrl-C产生的外部中断信号后,分别给两个子进程发信号(用户自定义信号)

# include
# include
# include
# include
#include
int EndFlag,pid1,pid2;
void IntSend()
{kill(pid1,10);//向进程pid1发送用户自定义信号10kill(pid2,12);// 向进程pid2发送用户自定义信号12EndFlag=1;
}
void Print1()
{printf("child process 1 is interrupted by parent !\n");exit(0);
}
void Print2()
{printf("child process 2 is interrupted by parent !\n");exit(0);
}
int main()
{int exitcode;signal(SIGINT,SIG_IGN);signal(SIGQUIT,SIG_IGN);while((pid1=fork())==-1);
if(pid1==0)
{ signal(SIGUSR1, Print1);     //用户自定义信号1signal(SIGQUIT,SIG_IGN);pause();exit(0);
}
else{while((pid2=fork())==-1);if(pid2==0){   		signal(SIGUSR2, Print2);	  //用户自定义信号2signal(SIGQUIT,SIG_IGN);pause();exit(0);}else{signal(SIGINT, IntSend);waitpid(-1,&exitcode,0);printf("parent process is interrupted! \n");exit(0);} }
}

运行结果:

^Cchild process 1 is interrupted by parent !
child process 2 is interrupted by parent !
parent process is interrupted!

结果分析:

  • 子进程屏蔽外部中断信号,父进程接收用户按“Ctrl+C”产生的外部中断信号后,分别给两个子进程发信号(用户自定义信号)。
  • 系统调用signal( )进行预置,子进程接收自定义信号后,调用预置的print函数,打印输出。(child1、child2顺序不定)。
  • 语句‘waitpid(-1,&exitcode,0)’代表父进程等待任何子进程,接收子进程状态结束值。等待子进程结束后,父进程打印输出,结束。

软中断通信:
了解了基本知识,硬中断,操作系统系统外设状态的变化。为了满足实时系统的要求,中断处理应该是越快越好。linux为了实现这个特点,当中断发生的时候,硬中断处理那些短时间就可以完成的工作,而将那些处理事件比较长的工作,放到中断之后来完成,也就是软中断来完成。基本的思路是: 父进程生成子进程,父进程发送信号并等待,子进程接收信号,然后自我终止并唤醒父进程,父进程再自我终止。


其中用到的函数介绍:

Signal()
预置对信号的处理方式,允许调用进程控制软中断信号。
系统调用格式:signal(sig,function)
头文件为: #include
由于不同系统的信号编号是不完全相同的,所以当前系统中,可以使用“kill -l”命令查看信号编号

名字说明
01SIGHUP挂起(hangup)
02SIGINT中断,当用户从键盘按ctrl+c或break键。
03SIGQUIT退出,当用户从键盘按quit键时
04SIGILL非法指令
05SIGTRAP跟踪陷阱(trace trap),启动进程,跟踪代码的执行
06SIGIOTIOT指令
07SIGEMTEMT指令
08SIGFPE浮点运算溢出
09SIGKILL杀死、终止进程
10SIGBUS总线错误
11SIGSEGV进程试图去访问其虚地址空间以外的位置
12SIGSYS系统调用中参数错,如系统调用号非法
13SIGPIPE向某个非读管道中写入数据
14SIGALRM闹钟。当某进程希望在某时间后接收信号时发此信号
15SIGTERM软件终止
16SIGUSR1用户自定义信号1
17SIGUSR2用户自定义信号2
18SIGCLD某个子进程死
19SIGPWR电源故障

kill()
系统调用格式:int kill(pid,sig)
参数定义
int pid,sig;
其中,pid是一个或一组进程的标识符,参数sig是要发送的软中断信号。
(1)pid>0时,操作系统将信号发送给进程pid。
(2)pid=0时,操作系统将信号发送给与发送进程同组的所有进程。
(3)pid=-1时,操作系统将信号发送给所有用户标识符真正等于发送进程的有效用户标识号的进程。


lockf()
头文件:#include
允许将文件区域用作信号量(监视锁),或用于控制对锁定进程的访问(强制模式记录锁定)。试图访问已锁定资源的其他进程将返回错误或进入休眠状态,直到资源解除锁定为止。当关闭文件时,将释放进程的所有锁定,即使进程仍然有打开的文件。当进程终止时,将释放进程保留的所有锁定。
lockf(fd,1,0)是给文件上锁; lockf(fd,0,0)是给文件解锁;


上一篇:Optional详解

下一篇:es环境搭建

相关内容

热门资讯

猫咪吃了塑料袋怎么办 猫咪误食... 你知道吗?塑料袋放久了会长猫哦!要说猫咪对塑料袋的喜爱程度完完全全可以媲美纸箱家里只要一有塑料袋的响...
埃菲尔铁塔在哪 中国仿建埃菲尔... 2019年4月26日,广西南宁市,街头惊现一座巨型山寨版埃菲尔铁塔,高约20米,白色塔身,造型逼真,...
ps局部放大 放大某个部位的图... 软件类学习建议:边看边练习,可以先收藏后学习。一、使用Ctrl快捷键放大:Ctrl + +缩小:Ct...
苗族的传统节日 贵州苗族节日有... 【岜沙苗族芦笙节】岜沙,苗语叫“分送”,距从江县城7.5公里,是世界上最崇拜树木并以树为神的枪手部落...
北京的名胜古迹 北京最著名的景... 北京从元代开始,逐渐走上帝国首都的道路,先是成为大辽朝五大首都之一的南京城,随着金灭辽,金代从海陵王...
应用未安装解决办法 平板应用未... ---IT小技术,每天Get一个小技能!一、前言描述苹果IPad2居然不能安装怎么办?与此IPad不...
脚上的穴位图 脚面经络图对应的... 人体穴位作用图解大全更清晰直观的标注了各个人体穴位的作用,包括头部穴位图、胸部穴位图、背部穴位图、胳...
长白山自助游攻略 吉林长白山游... 昨天介绍了西坡的景点详细请看链接:一个人的旅行,据说能看到长白山天池全凭运气,您的运气如何?今日介绍...
世界上最漂亮的人 世界上最漂亮... 此前在某网上,选出了全球265万颜值姣好的女性。从这些数量庞大的女性群体中,人们投票选出了心目中最美...
埃菲尔铁塔在哪 中国仿建埃菲尔... 2019年4月26日,广西南宁市,街头惊现一座巨型山寨版埃菲尔铁塔,高约20米,白色塔身,造型逼真,...
苗族的传统节日 贵州苗族节日有... 【岜沙苗族芦笙节】岜沙,苗语叫“分送”,距从江县城7.5公里,是世界上最崇拜树木并以树为神的枪手部落...
衡水一中在哪 兰州分校衡水一中 新甘肃客户端兰州6月6日讯(新甘肃·甘肃日报记者 曹立萍)今天上午,由中铁二十局市政公司承建的河北衡...
北京的名胜古迹 北京最著名的景... 北京从元代开始,逐渐走上帝国首都的道路,先是成为大辽朝五大首都之一的南京城,随着金灭辽,金代从海陵王...