资源预览内容
第1页 / 共9页
第2页 / 共9页
第3页 / 共9页
第4页 / 共9页
第5页 / 共9页
第6页 / 共9页
第7页 / 共9页
第8页 / 共9页
第9页 / 共9页
亲,该文档总共9页全部预览完了,如果喜欢就下载吧!
资源描述
实 验 报 告( 2010/ 2011学年 第 一 学期)课程名称操 作 系 统A实验名称进程通信实验时间20 10年10月 12 日指导单位计算机学院 计算机技术研究所指导教师 实 验 报 告实验名称进程通信指导教师实验类型验证实验学时2+2实验时间2010.10.12一、 实验目的和要求1. 熟练使用Linux的C语言开发环境2. 学习并掌握Linux编译工具gcc的使用方法3. Linux操作系统下的熟悉并能够进行进程创建4. 掌握Linux操作系统下的并发进程间同步5. 掌握Linux操作系统下的进程间通信IPC二、实验环境(实验设备)Windows 2000 + VMWare + RedHat Linux 8三、实验原理及内容(列出调试通过程序的清单,分析运行结果)1、 程序:#include int main( ) inti=getuid( ) ; printf(“Hello world! This is my uid: %dn”, i ) ; 编译:gcc o 1 1.c执行:./1输出:Hello world! This is my uid:02、进入Vi编辑器: $vi 2.c输入:i 便可以编辑了,退出:按下esc ,进入到命令模式后按下:wq,退出vi3、写入程序后编译:gcc 3.c执行:./a.out4、程序:#include #include #include int main(void) pid_t pid; int data=5; if(pid=fork()0) printf(“fork errorn”); exit(0); else if(pid=0) data-; printf(“childs data is:%dn”,data); exit(0); else printf(“parents data is:%dn”,data); 编译:gcc -o 4 4.c执行:./4输出:childs data is:4parents data is:55、程序#include #include #include main( ) pid_t pid; char *path=“/bin/ps“; char *argv5= “ps”,”-a”,”-x”,NULL; printf(“Run ps with execve by child process:n”); if(pid=fork( )0) printf(“fork error!”); exit(0); else if (pid=0) if(execve(path,argv,0)0) printf(“fork error!”); exit(0); printf(“child is ok!n”); exit(0); wait( ); printf(“it is ok!n”); exit(0); 编译:gcc -o 5 5.c执行:./5输出:Run ps with execve by child process:child is ok!it is ok!6、程序:/Client.c#include#include#include#define MSGKEY 75struct msgformlong mtype;char mtext256;main()struct msgform msg;int msgqid,pid,*pint;msgqid=msgget(MSGKEY,0777)pid=getpid();pint=(int*)msg.mtext;*pint=pid;msg.mtype=1;msgsnd(msgqid,&msg,sizeof(int),0);msgrcv(msgqid,&msg,256,pid,0);printf(“client:receive from pid%dn”,*pint);exit(0);实 验 报 告/server.c#include#include#include#define MSGKEY 75struct msgformlong mtype;char mtext256; void main()struct msgform msg;int msgqid,j,pid,*pint;msgqid=msgget(MSGKEY,0777|IPC_CREAT);for(;)msgrcv(msgqid,&msg,256,1,0);pint=(int*)msg.mtext;pid=*pint;printf(“server:receive from pid%dn”,pid);msg.mtype=pid;*pint=getpid();msgsne(msgqid,&msg,sizeof(int),0);编译:gcc -o server server.c gcc -o client client.c执行:./sever& ./client输出:client:receive from pid79827、程序:#include#include#includevoid waiting(),stop();int wait_mark;main()int p1,p2,stdout;signal(SIGINT,stop);while(p1=fork()=-1);if(p10) while(p2=fork()=-1);if(p20)wait_mark=1;sleep(5);waiting();kill(p1,16);kill(p2,17);wait(0);wait(0);printf(“parent process is killed!n”);exit(0);else wait_mark=1;signal(17,stop);kill(p2,17);waiting();lockf(stdout,1,0);printf(“child process2 is killed by parent!n”);exit(0);else wait_mark=1;signal(16,stop);waiting();lockf(stdout,1,0);printf(“child process1 is killed by parent!n”);lockf(stdout,0,0);exit(0);void waiting() while(wait_mark!=0);void stop() wait_mark=0;编译:gcc -o 7 7.c执行:./7 c输出:child process1 is killed by parent! child process2 is killed by parent! parent process is killed!实 验 报 告四、实验小结(包括总结上机调试过程中所遇到的问题和解决方法、感想与建议等)1、实验过程中输入的标点符号格式是很重要的,还有空格在Linux里是识别不出来了,这个问题老师告诉我们要是想直接拷贝已有的代码段,最好是用记事本来编写。2、利用消息缓冲队列进行进程间的通信时候,程序中的server.c在后台运行,而client.c是在前台运行的,所以我们执行的时候,要在执行语句./sever&后面输入&符才行,而且我们在运行界面上是看不到它的输出的。3.在这个程序中,执行好多次,每一次输出的数字都是不同的,深刻体现了消息的通信机制。每次运行后的数字是越来越大,没规律的增大的。4. 拷贝程序时候出现了优盘无法访问,于是找到Linux下的移动磁盘处理工具条,解决了这个问题。五、指导教师评语成 绩批阅人日 期8
收藏 下载该资源
网站客服QQ:2055934822
金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号