- 1、本文档共20页,可阅读全部内容。
- 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
实验六 软中断信号及处理;实验目的
加深对进程概念的理解,明确进程和程序的区别、进一步认识并发执行的实质
了解并熟悉Linux系统中利用软中断信号实现进程通信的基本概念及方法
熟悉Linux提供的有关系统调用函数/库函数,并能使用这些函数
实验准备及预习
阅读讲义《附件7-软中断信号及处理》,了解Linux系统中利用软中断信号实现进程通信的基本概念及方法
熟悉Linux提供的有关系统调用函数/库函数:alarm()、kill()、signal()、sleep()、pause();Linux的低级通信;;信号事件的发生有两个来源
硬件来源,比如我们按下了键盘或者其它硬件故障
软件来源,最常用发送信号的系统函数是kill, raise, alarm和setitimer以及sigqueue函数,软件来源还包括一些非法运算等操作
Linux中有30个软中断信号和31个实时软中断信号;常见软中断信号;忽略该信号
执行系统默认动作
捕捉信号
;;发送信号;#includesys/types.h?
#includesys/stat.h?
#includesignal.h?
#includeunistd.h?
#includestdio.h?
#includestdlib.h??
int?main()?
{?pid_t?pid;?
????pid=fork();?
????if(pid0)??{?
????????????perror(fork()?error\n);? }?
????if(pid==0) {?/*子进程*/???
????? printf(child?process?wait?for?signal!\n);?
????? pause(); /*挂起进程直至捕捉到一个信号*/
};;alarm()
语法格式:
#include unistd.h
unsigned int alarm(unsigned int seconds) ;
返回:0或以前设置的闹钟时间的余留秒数
参数:seconds的值是秒数,经过了指定的seconds秒后会产生信号SIGALRM
说明:
设置一个时间值(闹钟时间),在将来的某个时刻该时间值会被超过。当所设置的时间值被超过后,产生SIGALRM信号
如果不忽略或不捕捉此信号,则其默认动作是终止该进程
每个进程只能有一个闹钟时间。如果在调用alarm时,以前已为该进程设置过闹钟时间,而且它还没有超时,则该闹钟时间的余留值作为本次alarm函数调用的值返回。以前登记的闹钟时间则被新值代换 ;#includeunistd.h
#includestdio.h
#includestdlib.h
int main()
{
int ret;
alarm(50);
sleep(30); /*使进程睡眠30秒,期间要放弃CPU*/
ret=alarm(10);
printf(%d\n,ret);
pause(); /*使调用进程挂起直至捕捉到一个信号*/
printf(I have been waken up.\n,ret);
} ;捕捉信号;;;#includeunistd.h
#includestdio.h
#includestdlib.h
#includesignal.h
void msg();
int main()
{ int ret;
alarm(50);
sleep(30); /*使进程睡眠30秒,期间要放弃CPU*/
ret=alarm(10);
printf(%d\n,ret);
signal(SIGALRM, msg);
pause(); /*使调用进程挂起直至捕捉到一个信号*/
printf(I have been waken up.\n,ret);
}
void?msg()?
{? ?printf(“catched a?alarm?signal!\n);?}?;;#include unistd.h
#include stdio.h
#include signal.h
void waiting()
{
while(wait_mark!=0);
}
void stop()
{ wait_mark=0; }
void keep_alive()
{ };int main()
{
int p1,p2;
while((p1=fork())==-1);
if(p10){
while((p2=fork())==-1);
if(p20){
printf(“parent\n”);
wait_mark=1;
signal(SIG
文档评论(0)