欢迎来到天天文库
浏览记录
ID:41259970
大小:78.00 KB
页数:11页
时间:2019-08-20
《实验四 经典的进程同步问题》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库。
1、实验四一、编程实现生产者—消费者问题二、进程间的通信(软中断信号)三、实验目的1.掌握进程同步的实现算法1.了解什么是信号2.熟悉LINUX系统中进程之间软中断通信的基本原理实验四四、实验任务1.编写程序,创建生产者和消费者进程,生产者进程产生数据并写入缓冲区,消费者进程取数据并输出,缓冲区能存放四个数据,如果缓冲区满,则生产者不能写数据,并报警;如果缓冲区空,消费者不能取数据,并报警。(选做,2个生产者,2个消费者)2.编写程序:用fork()创建两个子进程,再用系统调用signal()让父进程捕捉键盘上来的中断信号(即按^c键);捕捉到中断信号后,父进程用系统调用kill()向两
2、个子进程发出信号,子进程捕捉到信号后分别输出下列信息后终止:Childprocess1iskilledbyparent!Childprocess2iskilledbyparent!父进程等待两个子进程终止后,输出如下的信息后终止:Parentprocessiskilled!实验四五、实验要求1.阅读有关的参考书,学习系统功能调用kill()、signal()的功能及用法2.输入实验指导中的参考代码,编译并运行能否得到结果?为什么?尝试修改源代码,得到预期的结果。3.写实验报告六、有关的系统功能调用:intkill(pid_tpid,intsig);//向进程组或进程发送信号pid:1
3、.pid大于零,pid是信号欲送往的进程的标识。2.pid等于零,信号将送往所有与调用kill()的那个进程属同一个使用组的进程。3.pid等于-1,信号将送往所有调用进程有权给其发送信号的进程,除了进程1(init)。4.pid小于-1时,信号将送往以-pid为组标识的进程。sig:准备发送的信号,其值为零则没有任何信号送出六、有关的系统功能调用:signal(intsig,intfunction)//;预置对信号的处理方式intsig:信号void(*function)()接收到指定信号后的处理函数参数sig值名字说明01SIGHUP挂起(hangup)02SIGINT中断,当用
4、户从键盘按^c键或^break键时03SIGQUIT退出,当用户从键盘按quit键时04SIGILL非法指令05SIGTRAP跟踪陷阱(tracetrap),启动进程,跟踪代码的执行06SIGIOTIOT指令07SIGEMTEMT指令08SIGFPE浮点运算溢出09SIGKILL杀死、终止进程10SIGBUS总线错误11SIGSEGV段违例(segmentationviolation),进程试图去访问其虚地址空间以外的位置12SIGSYS系统调用中参数错,如系统调用号非法13SIGPIPE向某个非读管道中写入数据14SIGALRM闹钟。当某进程希望在某时间后接收信号时发此信号15SI
5、GTERM软件终止(softwaretermination)16SIGUSR1用户自定义信号117SIGUSR2用户自定义信号218SIGCLD某个子进程死19SIGPWR电源故障#include#include#includevoidwaiting(),stop();intwait_mark;main(){intp1,p2,stdout;while((p1=fork())==-1);/*创建子进程p1*/if(p1>0){while((p2=fork())==-1);/*创建子进程p2*/if(p2>0){wait_mark
6、=1;七、参考代码signal(SIGINT,stop);/*接收到^c信号,转stop*/waiting();kill(p1,16);/*向p1发软中断信号16*/kill(p2,17);/*向p2发软中断信号17*/wait(0);/*同步*/wait(0);printf("Parentprocessiskilled!");exit(0);}else{wait_mark=1;signal(17,stop);/*接收到软中断信号17,转stop*/waiting();lockf(stdout,1,0);printf("Childprocess2iskilledbyparent!
7、");lockf(stdout,0,0);exit(0);}}else{wait_mark=1;signal(16,stop);/*接收到软中断信号16,转stop*/waiting();lockf(stdout,1,0);printf("Childprocess1iskilledbyparent!");lockf(stdout,0,0);exit(0);}}voidwaiting(){while(wait_mark!=0);}voidstop(
此文档下载收益归作者所有