操作系统实验3
- 格式:doc
- 大小:303.00 KB
- 文档页数:13
实验三管道及共享内存
一、实验目的
熟悉管道通信,了解管道内数据的读取与写入过程;
学会创建管道、使用管道,实现父子进程间的通信;
熟悉各种管道通信时使用的函数;
熟悉共享内存的概念;
学会使用函数创建共享内存段,熟悉操纵共享内存的四个系统调用。
二、实验内容
1、阅读例1的程序,运行及分析;
2、编写程序:父进程利用管道将一字符串交给子进程处理。子进程读字符串,将里面的字符反向后再交给父进程,父进程最后读取并打印反向的字符串;
3、阅读例2的程序,运行一次该程序,然后用ipcs命令查看系统中共享存储区的情况,再次执行该程序,再用ipcs命令查看系统中共享内存的情况,对两次的结果进行比较,并分析原因。最后用ipcrm命令删除自己建立的共享存储区;
4、每个同学登陆两个窗口,先在一个窗口中运行例3程序1(或者只登陆一个窗口,先在该窗口中以后台方式运行程序1),然后在另一个窗口中运行例3程序2,观察程序的运行结果并分析。运行结束后可以用ctrl+c结束程序1的运行
5、编写程序:使用系统调用shmget(),shmat(),shmdt(),shmctl(),编制程序;要求在父进程中生成一个30字节长的私有共享内存段。接下来,设置一个指向共享内存段的字符指针,将一串大写字母写入到该指针指向的存贮区。调用fork()生成子进程,让子进程显示共享内存段中的内容。接着,将大写字母改成小写,子进程修改共享内存中的内容。之后,子进程将脱接共享内存段并退出。父进程在睡眠5秒后,在此显示共享内存段中的内容(此时已经是小写字母)。
三、代码及运行结果分析
1、阅读例1的程序,运行及分析
代码:
运行结果:
分析:系统调用pipe(fd);创建管道,然后通过fork函数产生的两个进程,先执行子进程,子进程中,关闭读通道,并向管道中写入内容。然后进入父进程,写管道关闭,并读入管道中的内容,最后输出出来。
2、编写程序:父进程利用管道将一字符串交给子进程处理。子进程读字符串,将里面的字符反向后再交给父进程,父进程最后读取并打印反向的字符串;
相关代码:
运行结果:
3、阅读例2的程序,运行一次该程序,然后用ipcs命令查看系统中共享存储区的情况,再次执行该程序,再用ipcs命令查看系统中共享内存的情况,对两次的结果进行比较,并分析原因。最后用ipcrm命令删除自己建立的共享存储区;相关代码:
运行结果:
首次运行并用ipc命令查看:
"20.c" 18L, 428C written
[e06620204@localhost e06620204]$ gcc 20.c -o 20
[e06620204@localhost e06620204]$ ./20
First shared memory identifier is 3932183
Second shared memory identifier is 3964979
[e06620204@localhost e06620204]$ ipcs
------ Shared Memory Segments --------
key shmid owner perms bytes nattch st 0x00000000 917505 e06620120 644 20 0
0x00000000 98306 e0662209 644 20 0
0x00000000 1310723 e06620211 644 20 0
0x00000000 163844 e06620120 644 20 0
0x0000000f 196613 e06620217 644 1000 0
0x00000000 229382 e06620217 644 20 0
0x00000000 262151 e0662209 644 20 0
0x00000000 294920 e0662209 644 20 0
0x00000076 950281 e06620118 644 1000 0
0x00000000 360458 e06620113 644 20 0
0x00000000 393227 e06620120 644 20 0
0x000000dc 425996 e06620220 644 1000 0
0x00000000 458765 e06620220 644 20 0
0x00000000 491534 e06620120 644 20 0
0x00000000 557071 e06620113 644 20 0
0x000000c9 2916368 e0662201 644 1000 0
0x00000000 622609 e06620124 644 20 0
0x0000014d 655378 e06620333 644 1000 0
0x00000000 688147 e06620333 644 20 0
0x00000000 3440661 e06620120 644 30 0 0x00000000 786454 e06620120 644 20 0 0x000000cc 3932183 e06620204 644 1000 0 0x00000000 851992 e06620122 644 20 0 0x00000000 983065 e06620118 644 20 0 0x00000000 1015834 e06620120 644 20 0 0x0000007b 3473435 e06620121 644 1000 0 0x000000cb 1081372 e06620106 644 1000 0 0x00000000 1114141 e06620106 644 20 0 0x00000000 3506206 e06620121 644 20 0 0x00004ef3 1179679 e06620211 644 1000 0 0x00000000 1212448 e06620211 644 20 0 0x0000006c 1245217 e06620108 644 1000 0 0x00000000 1277986 e06620108 644 20 0 0x000000d0 1376291 e06620208 644 1000 0 0x00000000 1409060 e06620208 644 20 0 0x00000071 1441829 e06620113 644 1000 0 0x00000000 1474598 e06620113 644 20 0 0x00000078 1507367 e06620120 777 16384 1 0x00000000 2162728 e06620312 644 20 0 0x00000084 1605673 e06620132 644 1000 0 0x00000000 1638442 e06620132 644 20 0 0x00000462 1671211 e06620122 777 16384 1 0x000000e6 3538988 e06620230 644 1000 0 0x00000000 1736749 e06620205 644 20 0 0x000000e0 1769518 e06620224 644 1000 0 0x00000000 1802287 e06620224 644 20 0 0x0000006a 1835056 e06620106 644 1000 0 0x00000000 1867825 e06620106 644 20 0 0x00000000 3571762 e06620230 644 20 0 0x00000000 3964979 e06620204 644 20 0 0x00000000 1966132 e06620217 644 20 0 0x00000000 1998901 e06620217 644 20 0 0x00000000 2031670 e06620205 644 20 0 0x00000083 2064439 e06620131 644 1000 0 0x00000000 2097208 e06620131 644 20 0 0x00000000 2195513 e06620217 644 20 0 0x0000006b 2228282 e06620107 644 1000 0 0x00000000 2261051 e06620107 644 20 0 0x000000d4 2293820 e06620212 644 1000 0 0x00000000 2326589 e06620212 644 20 0 0x00000000 2359358 e06620224 644 20 0 0x00000000 2392127 e06620124 644 20 0