1操作系统实验报告姓名:xxx学号:110703xx完成时间:2013年11月21日2目录:实验一:UNIX/LINUIX入门…………………………………………………………………………………………..3实验二:进程管理………………………………………………………………………………………………………..5实验三:线程的管理…………………………………………………………………………………………………..11实验四:利用信号量实现进程间通信…………………………………………………………………….….15实验五:基于消息队列和共享内存的进程间通信……………………………………………….…...20实验六:一个进程启动另一个程序的执行…………………………………………………………..……253实验一UNIX/LINUIX入门一、实验目的了解UNIX/LINUX运行环境,熟悉UNIX/LINUX的常用基本命令,熟悉和掌握UNIX/LINUX下c语言程序的编写、编译、调试和运行方法。二、实验内容1、熟悉UNIX/LINUX的常用基本命令如ls、who、pwd、ps等。2、练习UNIX/LINUX的文本行编辑器vi的使用方法3、熟悉UNIX/LINUX下c语言编译器cc/gcc的使用方法。用vi编写一个简单的显示“Hello,World!”c语言程序,用gcc编译并观察编译后的结果,然后运行它。三、实验要求按照要求编写程序,放在相应的目录中,编译成功后执行,并按照要求分析执行结果,并写出实验报告。四、实验设计代码如下:#includestdio.hintmain(){printf(Hello,world);return0;}五、运行结果4六、收获及机会此次实验让我熟悉了c语言编译器cc/gcc的使用方法。七、参考资料《实验指导书》5实验二进程管理一、实验目的加深对进程概念的理解,明确进程与程序的区别;进一步认识并发执行的实质二、实验内容(1)进程创建编写一段程序,使用系统调用fork()创建两个子进程。当此程序运行时,在系统中有一个父进程和两个子进程活动。让每一个进程在屏幕上显示一个字符:父进程显示“a“;子进程分别显示字符”b“和字符“c”。试观察记录屏幕上的显示结果,并分析原因。(2)进程控制修改已编写的程序,将每一个进程输出一个字符改为每一个进程输出一句话,再观察程序执行时屏幕上出现的现象,并分析原因。(3)进程的管道通信编写程序实现进程的管道通信。使用系统调用pipe()建立一个管道,二个子进程P1和P2分别向管道各写一句话:Child1issendingamessage!Child2issendingamessage!父进程从管道中读出二个来自子进程的信息并显示(要求先接收P1,再接收P2)。三、实验要求按照要求编写程序,放在相应的目录中,编译成功后执行,并按照要求分析执行结果,并写出实验报告。四、实验设计(1)进程创建使用fork()创建两个子进程,父进程等待两个子进程执行完在运行。(2)进程控制使用fork()创建两个子进程,父进程等待两个子进程分别输出一句话在运行。(3)进程的管道通信建立一个管道。在程序中先建立一个子进程,然后向管道中输入数据,然后从子进程中退出到父进程,读出管道数据,然后再建立一个子进程,写入数据,再读出,即可。代码如下:(1)进程创建:#includestdio.h#includestdlib.hvoidmain(){intpid1,pid2;pid1=fork();if(pid10){printf(Fork1failed!!);}6if(0==pid1){printf(b);exit(0);}if(pid10){wait(NULL);pid2=fork();if(pid20){printf(Fork2failed!!);}if(0==pid2){printf(c);exit(0);}if(pid20){wait(NULL);printf(a);exit(0);}}}(2)进程控制:#includestdio.h#includestdlib.hvoidmain(){intpid1,pid2;pid1=fork();if(pid10){printf(Fork1failed!!);}if(0==pid1){printf(thisischildb\n);exit(0);}if(pid10){wait(NULL);pid2=fork();if(pid20){printf(Fork2failed!!);}if(0==pid2){printf(thisischildc\n);7exit(0);}if(pid20){wait(NULL);printf(fathera\n);exit(0);}}}(3)进程的管道通信#includestdio.h#includestdlib.h#includesys/types.h#includememory.hvoidmain(){intpid1,pid2;intpfd[2];char*msg1=Child1issendingamessage!;char*msg2=Child2issendingamessage!;charbuf[256];intr,w;if(pipe(pfd)0){printf(pipecreateerror!\n);exit(1);}pid1=fork();if(pid10){printf(Fork1failed!!);}if(0==pid1){close(pfd[0]);//writesleep(3);if(w=write(pfd[1],msg1,strlen(msg1))0){printf(wirteerror!\n);exit(1);}else{printf(child1sendmsgtopipe!\n);}exit(0);}if(pid10){8wait(NULL);pid2=fork();if(pid20){printf(Fork2failed!!);}if(pid20){close(pfd[1]);//readsleep(3);if(r=read(pfd[0],buf,256)0){printf(readerror!\n);exit(1);}else{printf(parentreadfrompipe:%s\n,buf);}wait(NULL);close(pfd[1]);//readsleep(3);if(r=read(pfd[0],buf,256)0){printf(readerror!\n);exit(1);}else{printf(parentreadfrompipe:%s\n,buf);}}if(0==pid2){close(pfd[0]);//writesleep(6);if(w=write(pfd[1],msg2,strlen(msg2))0){printf(writeerror!\n);exit(1);}else{printf(child2sendmsgtopipe!\n);}exit(0);}}}9五、运行结果(1)进程创建(2)进程控制10(3)进程的管道通信六、收获及机会此次实验让我对进程和管道有了进一步的理解,当需要创建两个子进程的时候,不能直接在第一个子进程中直接fork(),要保证在在父进程用fork()再次创建子进程,否则创建的不是两个子进程而会是3个,关于父子进程的执行顺序,是无法预知的,如果想要先让子进程运行,那么父进程一定要用wait(NULL)语句进行等待;关于管道,只用一个即可,但必须在第一个fork()之前创建,否则父子进程不会共享。在向管道中写入数据和从管道中读出数据的时候,要控制好管道的读写控制,例如读的时候必先关写,但是又不能关闭读(写)端过多,要确保读(写)的时候总是有端口可读(写),否则的话会造成读(写)失败。这些是我此次实验最大的收获,还需要在今后的时候发现更多的问题,有更深的理解。七、参考资料《实验指导书》11实验三线程的管理一、实验目的编写Linux环境下的多线程程序,了解多线程的程序设计方法,掌握最常用的三个函数pthread_create,pthread_join和pthread_exit的用法二、实验内容1、主程序创建两个线程myThread1和myThread2,每个线程打印一句话。使用pthread_create(&id,NULL,(void*)thread,NULL)完成。提示:先定义每个线程的执行体,然后在main中()创建几个线程,最后主线程等待子线程结束后再退出。2、创建两个线程,分别向线程传递如下两种类型的参数�传递整型值�传递字符三、实验要求按照要求编写程序,放在相应的目录中,编译成功后执行,并按照要求分析执行结果,并写出实验报告。四、实验设计先定义2个线程的带有参数的函数,参数分别为整型(int)和字符型(char),每个函数中打印出相对应线程的话。在main函数中,利用pthread_create函数创建该两个线程,在函数参数中的第四位,写入想要传进各进程的参数。然后利用pthread_join等待第二个结束后退出。代码如下:1、主程序创建两个线程myThread1和myThread2,每个线程打印一句话。#includestdio.h#includepthread.h#includestdlib.hvoidmyThread1(void){printf(Thisispthread1.\n);}voidmyThread2(void){printf(Thisispthread2.\n);}intmain(void){pthread_tid1,id2;intret1,ret2;ret1=pthread_create(&id1,NULL,(void*)myThread1,NULL);if(0!=ret1){printf(Createpthread1error!\n);exit(1);}12ret2=pthread_create(&id2,NULL,(void*)myThread2,NULL);if(0!=ret2){printf(Createpthread2error!\n);exit(2);}pthread_join(id1,NULL);pthread_join(id2,NULL);return(0);}2、创建两个线程,分别向线程传递如下两种类型的参数#includestdio.h#includepthread.h#includestdlib.hvoid*myThread1(void*arg){int*num;num=(int*)arg;printf(createparameteris%d.\n,*num);return(void*)0;}void*myThread2(void*arg){char*ch;ch=(char*)arg;printf(createparameteris%c.\n,*ch);return(void*)0;}intmain(void){pthread_tid1,id2;intret1,ret2;intnum=1;charch='a';int*p_num=#char*p_ch=&ch;ret1=pthread_create(&id1,NULL,myThread1,(void*)p_num);if(0!=ret1){printf(Createpthread1error!\n);exit(1);}ret2=pthread_create(&id2,NULL,myThread2,(void*)p_ch);if(0!=ret2){printf(Createpthread2error!\n);exit(2);}pthread_join(id1,NULL);13pthread_join(id2,NULL);return(0);}五、运行结果1、主程序创建两个线程