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

  1. 1、本文档共11页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
实验四 经典的进程同步问题

实 验 四 一、编程实现生产者—消费者问题 二、进程间的通信 (软中断信号) 三、实验目的 1. 掌握进程同步的实现算法 1. 了解什么是信号 2. 熟悉LINUX系统中进程之间软中断通信的基本原理 实 验 四 四、实验任务 1. 编写程序,创建生产者和消费者进程,生产者进程产生数据并写入缓冲区,消费者进程取数据并输出,缓冲区能存放四个数据,如果缓冲区满,则生产者不能写数据,并报警;如果缓冲区空,消费者不能取数据,并报警。(选做,2个生产者,2个消费者) 2. 编写程序:用fork( )创建两个子进程,再用系统调用signal( )让父进程捕捉键盘上来的中断信号(即按^c键);捕捉到中断信号后,父进程用系统调用kill( )向两个子进程发出信号,子进程捕捉到信号后分别输出下列信息后终止: Child process1 is killed by parent! Child process2 is killed by parent! 父进程等待两个子进程终止后,输出如下的信息后终止: Parent process is killed! 实 验 四 五、实验要求 1. 阅读有关的参考书,学习系统功能调用kill( )、 signal( )的功能及用法 2. 输入实验指导中的参考代码,编译并运行 能否得到结果?为什么?尝试修改源代码,得到预期的结果。 3. 写实验报告 * 六、有关的系统功能调用: int kill(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) ( ) 接收到指定信号后的处理函数 参数sig 电源故障 SIGPWR 19 某个子进程死 SIGCLD 18 用户自定义信号2 SIGUSR2 17 用户自定义信号1 SIGUSR1 16 软件终止(software termination) SIGTERM 15 闹钟。当某进程希望在某时间后接收信号时发此信号 SIGALRM 14 向某个非读管道中写入数据 SIGPIPE 13 系统调用中参数错,如系统调用号非法 SIGSYS 12 段违例(segmentation violation),进程试图去访问其虚地址空间以外的位置 SIGSEGV 11 总线错误 SIGBUS 10 杀死、终止进程 SIGKILL 09 浮点运算溢出 SIGFPE 08 EMT指令 SIGEMT 07 IOT指令 SIGIOT 06 跟踪陷阱(trace trap),启动进程,跟踪代码的执行 SIGTRAP 05 非法指令 SIGILL 04 退出,当用户从键盘按quit键时 SIGQUIT 03 中断,当用户从键盘按^c键或^break键时 SIGINT 02 挂起(hangup) SIGHUP 01 说 明 名 字 值 #include stdio.h #include signal.h #include unistd.h void waiting( ),stop( ); int wait_mark; main( ) { int p1,p2,stdout; while((p1=fork( ))= =-1); /*创建子进程p1*/ if (p10) { while((p2=fork( ))= =-1); /*创建子进程p2*/ if(p20) { wait_mark=1; 七、参考代码 signal(SIGINT,stop); /*接收到^c信号,转stop*/ waiting( ); kill(p1,16); /*向p1发软中断信号16*/ kill(p2,17); /*向p2发软中断信号17

文档评论(0)

xcs88858 + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

版权声明书
用户编号:8130065136000003

1亿VIP精品文档

相关文档