实验2:UNIX/Linux系统调用与无名管道通讯1、实验目的(1)、掌握Linux/UNIXC程序编辑和编译方法;(2)、掌握fork()系统调用的功能与编程方法;(3)、了解系统调用open()、close()、read()、write()、lockf()和sleep()的用法;(4)、掌握pipe()系统调用的机制与编程方法。2、实现设备一台装有Windows操作系统PC机,上装有虚拟机系统VMWare,实验过程通过VMWare系统启Linux系统工作。3、实验方法与注意事项实验室内的实验环境与系统是共用设施,请不要在系统内做对系统或对其他用户不安全的事情。要求每个同学登录后系统后,要在自己的家目录内容以自己(拼音)名字或学号,创建一个子目录。以后所有工作都要在自己的目录内进行。建议以后的实验都在同台计算机上做,这样可以保持连续性。要求认真读懂程序,分析程序,并根据执行结果,分析原因。用户要按通常实验要认真书写实验报告。4、实验过程1)进程的创建main(){inti;printf(Thisisatestprogramforfork()!\n);while((i=fork())==-1);//若创建失败,则反复创建printf(i=%d\n,i);//打印进程标识符if(i)printf(Parentprocess!\n);//i0,在父进程中elseprintf(Childprocess!\n);//i=0,在子进程中}编译并执行之,观察结果并分析原因。2)管道系统调用(1)用C语言编写一个程序,建立一个pipe,同时父进程生成一个子进程,子进程向pipe中写入一字符串,父进程从pipe中读出该字符串。解:程序如下:#includestdio.hmain(){intx,fd[2];charbuf[30],s[30];pipe(fd);/*创建管道*/while((x=fork())==-1);/*创建子进程失败时,循环*/if(x==0){printf(%s\n,TheChildprocess!);sprintf(buf,Thisisanexample\n);write(fd[1],buf,30);/*把buf中字符写入管道*/exit(0);}else{/*父进程返回*/printf(%s\n,TheParentProcess,andIamwaiting!);wait(0);read(fd[0],s,30);/*父进程读管道中字符*/printf(%s,s);}}(2)编写一程序,建立一个管道。同时,父进程生成子进程P1,P2,这两个子进程分别向管道中写入各自的字符串,父进程读出它们(如图3.21)。(选做)解:程序框图如图3.22所示,源程序如下:#includestdio.hmain(){inti,r,p1,p2,fd[2];charbuf[50],s[50];pipe(fd);/*父进程建立管道*/while((p1=fork())==-1);/*创建子进程P1,失败时循环*/if(p1==0){/*由子进程P1返回,执行子进程P1*/lockf(fd[1],1,0);/*加锁锁定写入端*/sprintf(buf,childprocessP1issendingmessages!\n);printf(childprocessP1!\n);write(fd[1],buf,50);/*把buf中的50个字符写入管道*/sleep(5);/*睡眠5秒,让父进程读*/lockf(fd[1],0,0);/*放管道写入端*/exit(0);/*关闭P1*/}else{/*从父进程返回,执行父进程*/while((p2=fork())==-1);/*创建子进程P2.失败时循环*/if(p2==0){/*从子进程P2返回,执行P2*/lockf(fd[1],1,0);/*锁定写入端*/sprintf(buf,ChildprocessP2issendingmessages\n);printf(childprocessP2!\n);write(fd[1],buf,50);/*把buf中字符写入管道*/sleep(5);/*睡眠等待*/lockf(fd[1],0,0);/*释放管道写入端*/exit(0);/*关闭P2*/}wait(0);if((r=read(fd[0],s,50))==-1)printf(can’treadpipen);elseprintf(%s\n,s);wait(0);if(r=read(fd[0],s,50)==-1)printf(Can'treadpipe\n);elseprintf(%s\n,s);exit(0);}}5、实验报告的内容与书写实验完毕后,要关闭系统。以书面形式记录下你的每一步过程,包括输入、输出信息,遇到的问题和解决的办法,(输出较多者可精简)。