实验四经典的进程同步问题

上传人:宝路 文档编号:48318084 上传时间:2018-07-13 格式:PPT 页数:11 大小:78.93KB
返回 下载 相关 举报
实验四经典的进程同步问题_第1页
第1页 / 共11页
实验四经典的进程同步问题_第2页
第2页 / 共11页
实验四经典的进程同步问题_第3页
第3页 / 共11页
实验四经典的进程同步问题_第4页
第4页 / 共11页
实验四经典的进程同步问题_第5页
第5页 / 共11页
点击查看更多>>
资源描述

《实验四经典的进程同步问题》由会员分享,可在线阅读,更多相关《实验四经典的进程同步问题(11页珍藏版)》请在金锄头文库上搜索。

1、实 验 四 一、编程实现生产者消费者问题 二、进程间的通信 (软中断信号) 三、实验目的 1. 掌握进程同步的实现算法 1. 了解什么是信号 2. 熟悉LINUX系统中进程之间软中断通信的基本原 理实 验 四四、实验任务1. 编写程序,创建生产者和消费者进程,生产者进程产生数据并写入缓冲区,消费 者进程取数据并输出,缓冲区能存放四个数据,如果缓冲区满,则生产者不能写 数据,并报警;如果缓冲区空,消费者不能取数据,并报警。(选做,2个生产者 ,2个消费者)2. 编写程序:用fork( )创建两个子进程,再用系统调用signal( )让父进程捕捉键盘 上来的中断信号(即按c键);捕捉到中断信号后,

2、父进程用系统调用kill( )向两 个子进程发出信号,子进程捕捉到信号后分别输出下列信息后终止:Child process1 is killed by parent!Child process2 is killed by parent!父进程等待两个子进程终止后,输出如下的信息后终止:Parent process is killed! 实 验 四 五、实验要求1. 阅读有关的参考书,学习系统功能调用kill( )、 signal( )的功能及用法2. 输入实验指导中的参考代码,编译并运行 能否得到结果?为什么?尝试修改源代码,得到预期的结果。3. 写实验报告六、有关的系统功能调用:int ki

3、ll(pid_t pid, int sig); /向进程组或进程发送信号pid:1. pid大于零,pid是信号欲送往的进程的标识。2.pid等于零,信号将送往所有与调用kill()的那个进程属同一个使用组的进程。3. pid等于-1,信号将送往所有调用进程有权给其发送信号 的进程,除了进程1(init)。4. pid小于-1时,信号将送往以-pid为组标识的进程。sig:准备发送的信号,其值为零则没有任何信号送出六、有关的系统功能调用: signal(int sig,int function)/;预置对信号的处理方式int sig:信号void (*function) ( ) 接收到指定信号

4、后的处理函数 参数sig值名 字说 明01SIGHUP挂起(hangup)02SIGINT中断,当用户从键盘按c键或break键时03SIGQUIT退出,当用户从键盘按quit键时04SIGILL非法指令05SIGTRAP跟踪陷阱(trace trap),启动进程,跟踪代码的执行06SIGIOTIOT指令07SIGEMTEMT指令08SIGFPE浮点运算溢出09SIGKILL杀死、终止进程 10SIGBUS总线错误11SIGSEGV段违例(segmentation violation),进程试图去访问其虚地址空间以外的位 置 12SIGSYS系统调用中参数错,如系统调用号非法13SIGPIPE

5、向某个非读管道中写入数据14SIGALRM闹钟。当某进程希望在某时间后接收信号时发此信号15SIGTERM软件终止(software termination)16SIGUSR1用户自定义信号117SIGUSR2用户自定义信号218SIGCLD某个子进程死19SIGPWR电源故障#include #include #include void waiting( ),stop( ); int wait_mark; main( ) int p1,p2,stdout;while(p1=fork( )= =-1); /*创建子进程p1*/if (p10)while(p2=fork( )= =-1); /*

6、创建子进程p2*/if(p20)wait_mark=1;七、参考代码signal(SIGINT,stop); /*接收到c信号,转stop*/ waiting( ); kill(p1,16); /*向p1发软中断信号16*/ kill(p2,17); /*向p2发软中断信号17*/ wait(0); /*同步*/ wait(0); printf(“Parent process is killed!n“); exit(0); elsewait_mark=1;signal(17,stop); /*接收到软中断信号17,转stop*/waiting( );lockf(stdout,1,0);prin

7、tf(“Child process 2 is killed by parent!n“);lockf(stdout,0,0);exit(0); else wait_mark=1; signal(16,stop); /*接收到软中断信号16,转stop*/ waiting( ); lockf(stdout,1,0); printf(“Child process 1 is killed by parent!n“); lockf(stdout,0,0); exit(0); void waiting( ) while(wait_mark!=0); void stop( ) wait_mark=0; 八、思考题1、lockf(stdout,1,0)的作用是什么? 2、该程序段前面部分用了两个wait(0),它们起什么作用? 3、该程序段中每个进程退出时都用了语句exit(0),为什么? 4、为何预期的结果并未显示出? 5、程序该如何修改才能得到正确结果?

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 中学教育 > 教学课件

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号