47.f9039b1a.js 5.9 KB

1
  1. (window.webpackJsonp=window.webpackJsonp||[]).push([[47],{328:function(t,s,a){"use strict";a.r(s);var n=a(14),r=Object(n.a)({},(function(){var t=this,s=t._self._c;return s("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[s("h1",{attrs:{id:"进程创建与进程间通信"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#进程创建与进程间通信"}},[t._v("#")]),t._v(" 进程创建与进程间通信")]),t._v(" "),s("h2",{attrs:{id:"本章导读"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#本章导读"}},[t._v("#")]),t._v(" 本章导读")]),t._v(" "),s("p",[t._v("通过练习理解进程创建以及进程并发执行的过程,握fork系统调用的方法,了解进程间通信的常用方法。")]),t._v(" "),s("h2",{attrs:{id:"实验内容"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#实验内容"}},[t._v("#")]),t._v(" 实验内容")]),t._v(" "),s("h3",{attrs:{id:"进程创建"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#进程创建"}},[t._v("#")]),t._v(" 进程创建")]),t._v(" "),s("p",[t._v("请问在下方的代码中,一共有多少个进程被创建?")]),t._v(" "),s("blockquote",[s("p",[t._v("可以通过fork返回的值来判断当前进程是子进程还是父进程。")])]),t._v(" "),s("div",{staticClass:"language-c extra-class"},[s("pre",{pre:!0,attrs:{class:"language-c"}},[s("code",[s("span",{pre:!0,attrs:{class:"token macro property"}},[s("span",{pre:!0,attrs:{class:"token directive-hash"}},[t._v("#")]),s("span",{pre:!0,attrs:{class:"token directive keyword"}},[t._v("include")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v("<unistd.h>")])]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token macro property"}},[s("span",{pre:!0,attrs:{class:"token directive-hash"}},[t._v("#")]),s("span",{pre:!0,attrs:{class:"token directive keyword"}},[t._v("include")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v("<stdio.h>")])]),t._v("\n \n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("int")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("main")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("fork")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("fork")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("&&")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("fork")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("||")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("fork")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("fork")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("sleep")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("100")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("return")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n")])])]),s("h3",{attrs:{id:"创建进程树"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#创建进程树"}},[t._v("#")]),t._v(" 创建进程树")]),t._v(" "),s("p",[t._v("编写程序创建进程树如图所示,在每个进程中显示当前进程标识getpid()和父进程标识getppid()。")]),t._v(" "),s("p",[s("img",{attrs:{src:"/OS_lab_tutorial/docs/.vuepress/public/Linux/tree.png",alt:"图片1",title:"进程树"}})]),t._v(" "),s("h3",{attrs:{id:"信号通信"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#信号通信"}},[t._v("#")]),t._v(" 信号通信")]),t._v(" "),s("p",[t._v("用fork()创建两个子进程,再用系统调用signal()让父进程捕捉键盘上来的中断信号(即DEL键);当捕捉到中断信号后,父进程用系统调用kill()向两个子进程发出信号,子进程捕捉到信号后分别输出下列信息后终止:")]),t._v(" "),s("p",[t._v("Child process1 is killed by parent!")]),t._v(" "),s("p",[t._v("Child process2 is killed by parent!")]),t._v(" "),s("p",[t._v("父进程等待两个子进程终止后,输出如下的信息后终止:")]),t._v(" "),s("p",[t._v("Parent process is killed!")]),t._v(" "),s("h3",{attrs:{id:"管道通信"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#管道通信"}},[t._v("#")]),t._v(" 管道通信")]),t._v(" "),s("p",[t._v("实现进程的管道通信,用系统调用pipe()建立一管道,二个子进程P1和P2分别向管道各写一句话:")]),t._v(" "),s("p",[t._v("Child 1 is sending a message!")]),t._v(" "),s("p",[t._v("Child 2 is sending a message!")]),t._v(" "),s("p",[t._v("父进程从管道中读出二个来自子进程的信息并显示。")])])}),[],!1,null,null,null);s.default=r.exports}}]);