《2023年操作系统实验报告进程的创建.docx》由会员分享,可在线阅读,更多相关《2023年操作系统实验报告进程的创建.docx(6页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、实验题目进程的创建小组合作否姓名班级学号一、实验目的1、了解进程的创建。2、了解进程间的调用以及实现。3、分析进程竞争资源的现象,学习解决互斥的方法。4、加深对进程概念的理解,结识并发执行的本质。二.实验环境Windows系统的计算机一台,女装了 L i nux虚拟机三、实验内容与环节1、f ork()系统调用的使用例子程序代码:# i n clu d e# i nclude# incl u d e i n t gl o b=3;int mai n (void)(pid_t p i d ; int Io c =3;p rintf (*b e fore fork ();glod=% d ,loc
2、= % d ,n,glo b ,1 o c );if( (pi d =fork()os”mnt/usl)/mklm-,乙力&工文件 编辑(岂) 查看(山 终端(I) 转到帮助rootloca Ihos t mldrrj)# gcc f i Ie 1 .c -o f i Ie 1 ,exeroot)oca Ihos t mldiH# ./f i Ie 1 .exebe fore fork():glod=3,loc=3.chi Id process changes glob and loc:parent process doesnt change the glob and loc:g lob=4,
3、loc=2parent process doesnt change the glob and loc:glob=3.Ioc=3rootloca Ihos t ml did# |2、理解vo fork ()调用:程序代码:# in c 1 u dein c lu d e# inc 1 udeint gio b =3;int m a in(vo i d)(p i d_t pid;in t lo c =3;i f ( p i d =vfork () )0)(printf (vfork() errorn 11);exit(O);)else i f (p i d=0)(gl ob+;1 o c-;pr
4、i ntf(c h ild pro c ess changes t h e glob and locn);e xit (0);e 1 sep r in t f (pa r ent process do e s nt chang e t h c glob a nd lo c n); p r i nlf(glob=% d , v a l=%dn, g lo b ,1 o c );运营结果:rootloca Ihos t mldrrj# ./f i Ie2 .exechild process changes the glob and locparent process doesnt change t
5、he glob and locg lob=4 .va 1=2rootloca Ihos t mldrh#3、给进程指定一个新的运营程序的函数exec() .程序代码:p r i ntcl. c 代码:# inclu d eint m a i n (i n t a r gc,char * ar g v 口)(int n;char * * ptr;extern ch a r * * environ;dfor( n =0;n a rgc;n+)printf ( a rgv%dl:% s n , n ,argvn);for(ptr=envi r on; * ptr!= 0 ;p t r+)prinlf
6、 (%sn,*plr);exi t (0);)fi 1 c4.c代码如下:#i n clu d e #inckide#inc 1 ud e #i n cl u d e cha r * env_list = USER=roo t P A T H =/r o ot/,NULL; in t main ()(pid_t pid;i f(pid=fork()0)(甲 r int f (fork er r or! n);。exit(O);)else if(p i d = 0 )。 if(c x cclcCVroot/p r inti, p rintl, arg 1 Jar g 2 11 ,(char *)
7、 0, e n v _list) 0 ) p r i ntf (execl e e rror! n 11 );。e xi t ( 0 );)i f(w a itpid(p i d,NULL, 0 )0)o p r intf( WAIT ERROR! n );ex i t(0);if (pid= f ork() 0 )。 pri n tf( 11 fork e r ror!n );e xit( 0);else i f(pid=0)0 1i f (execlpCp r intlpr inti, a rgI(c h a r *)0) 0 )o printf (execle er r o r ! nn
8、);c x it(0);) exit(0);I运营结果:rootloca Ihos t inldirj# ./f i Ie4 .exearg0:pr int1argl:arglarg2:arg2USER=roo tPATtt=/root丫|rootloca ihos t mldrri#JI4、进程终止函数exit。程序代码:#inc 1 udem a in()(print f (this is a e x it s ystcm cal 1 ! n);ex i t (0);print f ( t his sentence n ev e r be displ aye n:n);)#includem
9、ain ()(pr i ntf( t h i s is a _exit_test sy s t em call! n);prin t f (content i n buffer);ex i t ( 0);)运营结果:rootloca Ihos t ml did# gcc ex i t_tes t .c -o ex i t_tes t .exe rootloca Ihos t mldrrO# ./ex i t_tes t .exe this is a ex i t systern ca 11!rootloca Ihos t ml did# 1roo tloca Ihos t mldrri# gc
10、c _ex i t_tes t .c -o _ex i t_tes t .exerootloca Ihos t mldrrO# ./_ex i t_tes t .exethis is a _exit_test Tystemcall!tloca Ihos t mldnirt5、wait。函数和s 1 e ep。函数。程序代码:#i n cludema i n()(i nt pidl;if(pidl=fork()i f (fork ()pr i nt f (p a r en ts c oniextAn1);printf( 11 parents waiting the c h ildl term i
11、 n a t e , n 11 ); wait(O);p r i n tf( 11 pa r e n ts wait i ng th e c h ild2 te r m i n ate,n); w a it (0);pri n t f ( p a r enl term in a t e s ,n);exit(O);Ielseprint f ( c h ild2s context, n );sleep(5);printf( child2 tc r minatc s ,n);e x it(O);)els e(i f ( p i d I =0)p r intf( c hi 1 d 1 s conte
12、 x t, n );s Ieep(10);p r i ntf (c h i Idl tc r mi n ates,n); exit( 0);运营结果:rootloca Ihos t mldrrO# ./f i Ie6.exe ch i Idls con tex t.ch i Id2s contex t. parents con tex t.parent s i t ing the ch i Idl termina te .ch i Id2 termina tes .parent s wailing the ch i Id2 termina te , ch i Idl terinina tes
13、, parent termina tes, rootloca Ihos t mldrrO#6、编写一段程序,父进程使用fork()创建两个子进程,运用输出函数put char父进程显示字符 a,两个子进程分别显示“b”和“c”。程序代码:# i ncludci n c lud e # includ e int ma i n()(i nt pid;if (pid=fork ()(i f (fork()prin t f( pa r ent proc ess is n );put char( A*);pri n tf(n );elsep r intf( ch ild2 p r o ces s i s
14、 n);p u tchar(C);print f ( n); els eif( p i d = 0 )printf( chi 1 d 1 pro cess i s n);p ut c h ar( B );printf(n);|运营结果:文件(E 编辑(E) 查看(义) 终端(I) 转到(O 帮助(Wrootloca Ihos t mldni)# v im kaosh i、rootloca Ihos t mldrrO# v im kaosh i .crootlocaIhost mldnd# ./kaosh i .exechi Idl process isBchi Id2 process isC
15、parent process is Arootloca Ihos t mldrri# ./kaoshi .exe四、实验过程与分析1、在1例子中,调用对的完毕时,给父进程返回的是被创建子进程标记,给子进程自己返回的是0;创建失败时,返回给父进程的是一1。2、在2例子中,v f ork ()调用后需要注意两点:子进程先运营,父进程挂起。子进程调用exec ()或e xit0之后。父进程的执行顺序不再有限制。(2)子进程在调用cxcc()或exit。之前。父进程被激活,就会导致死 锁。3、在6例子中,上述程序是父进程先创建一个子进程,若成功,再创建另一个子进程,之后三个进程并发执行。究竟谁先执行,
16、是随机的。所以执行 结果有多重种。五、实验总结1、一个进程调用exec ()函数来运营一个新程序。之后该进程的代码段、 数据段和堆栈段就被新程序的所代替。新程序从自己的main ()函数开始 执行。exec。函数有6种不同的形式,任何一个都可以完毕exec ()的功能, 只是调用参数不同。2、在父子进程同步中,当一个进程结束时,产生一个终止状态字,然后核心 发一个S IGCH LD信号告知父进程。由于子进程结束是异步于父进程的, 故父进程要结束之前,要同步等待子进程终止。这是通过调用系统调用 wait或wa i tp i d来实现的。当父进程通过调用wa i t或w a itp i d同步等待子进程结束时,也许有以 下几种情况:(1)假如子进程尚未结束,父进程阻塞等待;(2 )假如子进程已经结束,其终止状态字SIGCHLD放在指定位置等待父 进程提取,这时,父进程可立即得到终止状态字并返回;(3)假如没有子进程,父进程立即错误并返回。