实验三、进程通信(一)----------——管道及.docVIP

  • 9
  • 0
  • 约5.48千字
  • 约 22页
  • 2022-11-15 发布于江苏
  • 举报

实验三、进程通信(一)----------——管道及.doc

实验三、进程通信(一)----------——管道及共享内存 操作系统实验报告 实验三、进程通信(一) ——管道及共享内存 实验目的 加深对管道通信的了解 掌握利用管道进行通信的程序设计 了解共享内存通信的程序设计方法 了解和熟悉Linux支持的共享存储区机制 实验内容 任务一、 (1)阅读以上父子进程利用管道进行通信的例子(例1),写出程序的运行结果并分析。 (2)编写程序:父进程利用管道将一字符串交给子进程处理。子进程读字符串,将里面的字符反向后再交给父进程,父进程最后读取并打印反向的字符串。 任务二、 (1)阅读例2的程序,运行一次该程序,然后用ipcs命令查看系统中共享存储区的情况,再次执行该程序,再用ipcs命令查看系统中共享内存的情况,对两次的结果进行比较,并分析原因。最后用ipcrm命令删除自己建立的共享存储区。 (有关ipcs和ipcrm介绍见后面一页) (2)每个同学登陆两个窗口,先在一个窗口中运行例3程序1(或者只登陆一个窗口,先在该窗口中以后台方式运行程序1),然后在另一个窗口中运行例3程序2,观察程序的运行结果并分析。运行结束后可以用ctrl+c结束程序1的运行。 (3)编写程序:使用系统调用shmget(),shmat(),shmdt(),shmctl(),编制程序。要求在父进程中生成一个30字节长的私有共享内存段。接下来,设置一个指向共享内存段的字符指针,将一串大写字母写入到该指针指向的存贮区。调用fork()生成子进程,让子进程显示共享内存段中的内容。接着,将大写字母改成小写,子进程修改共享内存中的内容。之后,子进程将脱接共享内存段并退出。父进程在睡眠5秒后,在此显示共享内存段中的内容(此时已经是小写字母)。 代码及运行结果分析 阅读以上父子进程利用管道进行通信的例子(例1),写出程序的运行结果并分析 运行结果: 分析: 调用pipe(fd);创建一个管道后,接着调用fork()函数产生两个进程,首先开始执行子进程,关闭管道出口,通过管道入口向管道中写入内容。执行if语句后,进入else语句块内开始父进程,管道入口关闭,通过管道出口端从管道中读取之前写入内容,最后输出出来 编写程序:父进程利用管道将一字符串交给子进程处理。子进程读字符串,将里面的字符反向后再交给父进程,父进程最后读取并打印反向的字符串。 实验代码: #includestdio.h main() { int x,count,left,right,temp,fd[2],fe[2]; char c,buf[30],s[30]; pipe(fd); pipe(fe); printf(please input a line of char); scanf(%s,buf); while((x=fork())==-1); if(x==0) { close(fd[0]); close(fe[1]); printf(Child Process!\n); write(fd[1],buf,30); read(fe[0],buf,30); printf(%s\n,buf); exit(0); } else{ close(fd[1]); close(fe[0]); count=0; do {read(fd[0],c,1); s[count++]=c; }while(c!=\0); printf(Parent Process!\n); printf(%s\n,s); count-=2; for(left=0,right=count;left=count/2;left++,right--){ temp=s[left]; s[left]=s[right]; s[right]=temp; } write(fe[1],s,30); wait(0); } 运行结果: 阅读例2的程序,运行一次该程序,然后用ipcs命令查看系统中共享存储区的情况,再次执行该程序,再用ipcs命令查看系统中共享内存的情况,对两次的结果进行比较,并分析原因。最后用ipcrm命令删除自己建立的共享存储区。 (有关ipcs和ipcrm介绍见后面一页) 实验代码: #include sys/types.h #include sys/ipc.h #include sys/shm.h main() { key_t key=208; /*在实际实验过程中,为了避免每个同学建立的共享存储区关键字一样而相互干扰,关键字请用学号末3位*/ int shmid

文档评论(0)

1亿VIP精品文档

相关文档