实验1:安装操作系统
--安装Windows 20## Professional
1、实验目的:
1) 通过对Windows 20## Professional的安装操作,了解操作系统应用环境建立的初步过程。
2) 掌握对Windows操作系统的基本系统设置。
3) 了解Windows多操作系统安装的方法。
2、工具/准备工作
在开始本实验之前,请回顾教科书的相关内容。
需要一台准备安装Windows 20## Professional操作系统的计算机。
Windows 2000是一款功能强大的系统软件,它对系统的要求也比较高。系统安装时,对计算机硬件设备的最低要求如表1-2所示。
表1-2 安装Windows 2000的硬件需求
3、实验内容与步骤
本实验以光盘启动、全新安装为例。
可以利用Windows 20## Professional光盘来直接开机启动,开机后自动执行安装程序。 (因此,在执行安装操作之前,请检查你的计算机是否允许从光盘驱动器引导启动,否则应对机器的BIOS进行相应的设置。)
安装Windows 20## Professional首先需要建立分区,然后才开始运行安装程序。所以,整个安装过程可分为两个阶段:
· 文字模式阶段:主要是选择用来安装Windows 2000的硬盘。安装程序提供了建立分区、删除分区以及格式化等功能。
· GUI图形界面阶段:进行系统设置与复制文件的动作,完成Windows 2000系统的安装。
步骤1:将Windows 20## Professional安装盘放入光驱,启动机器后,屏幕正常显示欢迎信息。
步骤2:若选择开始安装Windows 2000,可依据屏幕上安装向导的提示,单击回车键。
步骤3:按F8键同意接受Windows许可协议,继续安装。
步骤4:屏幕下方列表显示了这台计算机上现有磁盘分区和尚未划分的磁盘空间。
请记录:
这台机器总的硬盘空间是:_296.76_GB。
将划分好的各硬盘的数据填入表1-3中。
表1-3 实验记录
选择用于安装Windows 20## Professional的硬盘分区是:_C_盘。单击回车键继续安装。
步骤5:屏幕提示选择合适的文件系统
Windows 2000主要支持三种不同的文件系统:FAT、FAT32和NTFS,但一般建议选择NTFS文件系统。为什么?
_NTFS文件系统相对其他两种文件系统更稳定。_
文件系统选定后,单击回车键继续。
步骤6:屏幕显示格式化提示。确认请按F键,否则可按Esc键退出重新选择。
单击F键后,系统执行磁盘格式化操作。
接着,安装程序将文件复制到Windows 2000安装文件夹。
然后,安装程序初始化Windows 2000配置。
步骤7:系统提示从驱动器中移去安装启动盘,重新启动机器。
步骤8:进入Windows 20## Professional环境,继续进行安装操作。
步骤9:系统提示插入“Service Pack 2 CD”光盘,插入 (原系统启动盘) 后,单击“确定”,系统读入相关文件。
步骤10:安装程序检测和安装设备。
步骤11:区域设置。默认所在区域为“中国”,单击“下一步”。
步骤12:输入用户及所在单位名称;这里输入的内容会体现在很多应用程序文档的属性设置中,请注意观察。
步骤13:输入软件的产品序列号 (25个字符的产品密钥) ,单击“下一步”。
步骤14:输入计算机名称、系统管理员密码和确认密码,单击“下一步”。输入的新的计算机名可以包含字母 (A - Z) ,数字 (0 – 9) 以及连字符,但不能包
含空格或逗号 (,) 。名称不能都是数字。步骤15:输入当前日期、时间及用户所在时区,单击“下一步”。
步骤16:在进行网络设置和安装Windows 2000组件等一系列任务后,单击“完成”,结束安装向导。
步骤17:从驱动器中移去安装启动盘,重新启动机器并进入Windows 2000,系统启动“网络标识向导”,引导将用户计算机连接到网络上。
首先设置本机用户。可以要求所有用户登录前输入用户名和密码,或者让Windows假设相同的用户始终登录到本机上。建议选择前者以尽量保证系统使用的安全性。
选择后,单击“完成”,网络访问标识完成。
步骤18:系统显示登录界面,输入口令,以管理员身份登录到Windows 2000系统。至此,Windows 20## Professional的安装即告完成。
四、实验总结
通过对Windows 20## Professional的系统安装操作,我们了解操作系统应用环境建立的初步过程,掌握了Windows操作系统的基本系统设置,还了解了Windows多操作系统安装的方法,对计算机的硬件环境有了不小的认识。
实验2:操作系统环境
--操作系统的计算环境
1、实验目的:
通过实验,加深对以下内容的理解:
1) 基本的计算机硬件组件;
2) 计算机操作系统;
3) Windows的发展和版本
4) UNIX和Linux的历史和版本;
5) Windows 20##、UNIX或Linux操作环境。
调查在机构、学校和学生中Windows、UNIX和Linux操作系统的使用情况。分别研究支持Windows和Linux的Web站点。
2、工具/准备工作
在开始本实验之前,请回顾教科书的相关内容。
请联系指导老师或者熟识网络技术的人士,如学校或企业信息技术部门的职员,了解你所在的学校 (或者其他机构) 中使用了哪些服务器和网络操作系统,找出是否在用Windows NT/2000/XP、UNIX和Linux以及在哪里使用这些操作系统。
需要准备一台带有浏览器,能够访问因特网的计算机。
3、实验内容与步骤
(1) 识别一台计算机的4个主要硬件组成部分。
1) _处理器_
2) _存储器_
3) _输入设备
4) _输出设备_
(2) 在空格中,填写3个概念中的一个:内核、shell或者文件系统。
1) _shell_ 表现为用户界面,把用户的需求翻译为系统活动。
2) _内核_ 在用户之间管理和分配资源。
3) _shell_ 提供命令解释。
4) _文件系统_ 以层次化的结构组织和存储数据。
5) _文件系统_ 进行内存管理。
6) _文件系统_ 组成部分是文件和目录。
7) _内核_ 管理硬盘、磁带机、打印机、终端、通信线路和其他设备。
(3) Windows 2000/XP操作系统的主要优点是什么?
1) _Windows XP兼容性好,软件资源丰富_
2) _速度快_
3) _占用资源少_
4) _用户操作无障碍,绝大部分会使用电脑的人都能比较自如地使用WindowsXP操作系统_
(4) UNIX操作系统的主要优点是什么?
1) _精巧的核心与丰富的实用层_
2) _使用灵活的命令程序设计语言shell_
3) _层次式文件系统,文件和设备统一看待_
4) _良好的一致性_
(5) Linux操作系统的主要优点是什么?
1) _Linux的文件系统毋庸置疑具备更高的效率_
2) _Linux是真正的多用户操作系统_
3) _在Linux上,一切设备都文件_
4) _Linux用分时管理方法使所有的任务共同分享系统资源_
(6) 列举Linux操作系统的主要组成部分。
1) _内核_
2) _shell_
3) _应用程序_
(7) Linux内核管理着哪几件事情?
1) _存储管理_
2) _CPU和进程管理_
3) _文件系统、设备管理_
(8) Linux系统的主要shell的名字和它们各自默认的提示符是什么?
1) /bin/csh
2)/bin/sh
3)/usr/bin/es
4)/usr/bin/ksh
5)/bin/ksh
6)/usr/bin/rc
7)/usr/bin/tcsh
8)/bin/tcsh
9)/usr/bin/esh
10)/bin/bash
11)/bin/rbash
12)/bin/ksh93
(9) 操作系统的文件系统由哪几部分组成的?
1) _核心WinFS_
2) _数据模型_
3) _架构_
4) _服务_
5) _API_
(10) 在指导老师或者信息技术人员的帮助下,找出在学校或者其他机构中使用的几种操作系统。请列举其版本、支持厂商和服务器的功能,填入表2-1中。
描述你所调查的范围及其基本情况:_调查范围为学校以及校内学生,基本情况是大多数计算机使用的都是Windows系列操作系统,其中以XP和win7为主_
在你的调查范围中拥有计算机的基本情况:_多一半学生拥有个人计算机_
表2-1 实验记录
(11) 通过有关教科书和对Web网站的搜索了解,列举出你找到的Linux发行版本及其支持厂商和网站,填入表2-2中。
表2-2 实验记录
四、实验总结
通过这个实验,我们加深了对以下内容的理解:
1) 基本的计算机硬件组件;
2) 计算机操作系统;
3) Windows的发展和版本;
4) UNIX和Linux的历史和版本;
5) Windows 2000、UNIX或Linux操作环境。
这里重点要说的是,第三点和第四点。对于UNIX和Linux操作系统我们了解的不如Windows那么广泛以及深入,这次实验的展开正好弥补了我们关于这方面知识的空缺。对于这两者的操作环境也一样,通过和windows操作环境的对比,我们也能更好的掌握这三者的优点与缺点,进而进行选择。
实验3:进程的控制与描述
--Windows“任务管理器”的进程管理
1、实验目的:
通过在Windows 任务管理器中对程序进程进行响应的管理操作,熟悉操作系统进程管理的概念,学习观察操作系统运行的动态性能。
2、工具/准备工作
在开始本实验之前,请回顾教科书的相关内容。
需要准备一台运行Windows 20## Professional操作系统的计算机。
3、实验内容与步骤
启动并进入Windows环境,单击Ctrl + Alt + Del键,或者右键单击任务栏,在快捷菜单中单击“任务管理器”命令,打开“任务管理器”窗口。
在本次实验中,你使用的操作系统版本是:
_Windows 7_
当前机器中由你打开,正在运行的应用程序有:
1) _操作系统实验报告.doc_
2) _Fetion 2010_
3) _Windows Live Messenger_
4) _我的文档_
Windows“任务管理器”的窗口由_6_个选项卡组成,分别是:
1) 应用程序
2) 进程
3)服务
4)性能
5)联网
6)用户
当前“进程”选项卡显示的栏目分别是 (可移动窗口下方的游标/箭头,或使窗口最大化进行观察) :
1) _Fetion.exe_
2) _iku.exe_
3) _KuGoo.exe_
4) _PPLive.exe_
5) _TM.exe_
6) _wlcomm.exe_
7) _winlogon.exe_
8) _msnmsgr.exe_
1) 使用任务管理器终止进程
步骤1:单击“进程”选项卡,一共显示了_76_个进程。请试着区分一下,其中:
系统 (SYSTEM) 进程有_2_个,填入表3-1中。
表3-1 实验记录
服务 (SERVICE) 进程有_6_个,填入表3-2中。
表3-2 实验记录
用户进程有_38_个,填入表3-3中。
表3-3 实验记录
步骤2:单击要终止的进程,然后单击“结束进程”按钮。
终止进程,将结束它直接或间接创建的所有子进程。例如,如果终止了电子邮件程序 (如Outlook 98) 的进程树,那么同时也终止了相关的进程,如MAPI后台处理程序mapisp32.exe。
请将终止某进程后的操作结果与原记录数据对比,发生了什么:
_进程结束并消失,之前进程占用的内存空间也随之被释放_
2) 显示其他进程记数器
在“进程”选项卡上单击“查看”菜单,然后单击“选择列”命令。单击要增加显示为列标题的项目,然后单击“确定”。
为对进程列表进行排序,可在“进程”选项卡上单击要根据其进行排序的列标题。而为了要反转排序顺序,可再次单击列标题。
经过调整,“进程”选项卡现在显示的项目分别是:
_映像名称、用户名、会话ID、CPU、页面错误、线程数、用户对象、描述_
通过对“查看”菜单的选择操作,可以在“任务管理器”中更改显示选项:
· 在“应用程序”选项卡上,可以按详细信息、大图标或小图标查看。
· 在“性能”选项卡上,可以更改CPU记录图,并显示内核时间。“显示内核时间”选项在“CPU使用”和“CPU使用记录”图表上添加红线。红线指示内核操作占用的CPU资源数量。
3) 更改正在运行的程序的优先级
要查看正在运行的程序的优先级,可单击“进程”选项卡,单击“查看”菜单,单击“选择列”-“基本优先级”命令,然后单击“确定”按钮。
为更改正在运行的程序的优先级,可在“进程”选项卡上右键单击您要更改的程序,指向“设置优先级”,然后单击所需的选项。
更改进程的优先级可以使其运行更快或更慢 (取决于是提升还是降低了优先级) ,但也可能对其他进程的性能有相反的影响。
记录操作后所体会的结果:
_当设置进程优先级高或是高于标准时,进程速度加快;当设置进程优先级低或是低于标准时,进程速度变慢,被放至所有进程的最后进行_
在多处理器计算机上,用户还可以给处理器指派进程,将程序或进程的执行限制在选定的处理器上,但这有可能导致总体性能的下降。
四、实验总结
通过本次实验,我们可以熟练掌握在windows操作系统中任务管理器对程序进程进行响应的管理操作,熟悉操作系统进程管理的概念,以及学习观察操作系统运行的动态性能。以下是一些要点:
启动并进入Windows环境中,单击Ctrl + Alt + Del键,或者右键单击任务栏,在快捷菜单中单击“任务管理器”命令,打开“任务管理器”窗口:
(1) 可以看到当前“进程”选项卡显示的栏目、“任务管理器”窗口的选项卡组成以及正在运行的应用程序;
(2) 可以终止任意正在运行的进程;
(3) 可以显示其他进程记数器;
(4) 可以更改正在运行的程序的优先级,使系统更有效率地进行运作。
第二篇:计算机操作系统实验报告
计算机操作系统实验报告
实验一
一、实验目的
在单处理器环境下,实现互斥和同步的控制。
熟悉并掌握常用Windows命令行。
更进一步理解PV操作的并发控制的实现。
二、Windows命令行常用命令
dir是英文单词directory(目录)的缩写,主要用来显示一个目录下的文件和子目录。
md是英文make directory(创建目录)的缩写。功能:创建一个子目录
cd是英文change directory(改变目录)的缩写,功能:改变目录
rd是英文remove directory(删除目录)的缩写,功能;:删除目录
copy功能:复制一个或一组文件至指定的目录中
del是英文delete(删除)的缩写,功能:删除指定目录下一个或一组文档
edit功能:edit是一个简单的编辑软件,可用于编辑程序或批处理文件。
bacc功能:编译指定的文件(如bacc dd)
bainterp功能:运行指定文件(如:bainterp dd)
三、并发程序设计
题目:在BACI环境下,对程序并发执行的实验:
(1)没有控制时正确的程序执行的结果不正确;
(2)BACI中PV操作的并发控制的实现。
实验1、多进程共享内存堆栈
(1)设计思路:
(2)代码:
int stack[10]; semaphore s=1; int top=4;
void release(int free)
{
p(s);
top++;
cout<<"top="<<top<<endl;
stack[top]=free;
v(s);
}
main()
{
int i;
for(i=0;i<10;i++) stack[i]=-1;
stack[0]=0;
stack[1]=156;
stack[2]=254;
stack[3]=129;
stack[4]=23;
cobegin { getspace(); release(100); }
cout<<"top="<<top<<endl;
for(;top>=0;top--)
cout<<"stack["<<top<<"]="<<stack[top]<<endl;
}
实验2、同步关系_奇数偶数
假定有三个进程R、W1、W2共享一个缓冲区B,而B每次只能存放一个整数。当缓冲区中无数时,进程R可以从输入设备上读入一个整数并存入B中;若存到B中的数是奇数,则允许进程W1将其取出打印;若是偶数,则允许进程W2将其取出打印。另外规定:进程R必须等B中的数被取出打印后才能再存放下一个数,进程W1或W2对每次存入的数只能打印一次并且都不能从空的缓冲区中取数。请用PV操作实现R、W1和W2三个进程的并发执行。
代码:
实验二
一、实验目的
1.目的
1、进程通信是多任务协作的基础,具有广泛的应用。
2、熟悉Linux的基于消息队列的进程通信的系统调用,并实现一个简单的C/S结构的实例。
二、Linux环境下常见shell命令
cd 改变当前的工作目录 cd /usr/src
Ls 列出当前目录的文件名及子目录名 ls –l *.c
cp 文件拷贝 cp *.c /mnt/usb
rm 删除文件 rm a.out
mkdir 创建一个子目录 mkdir /usr/myData
rmdir 删除一个子目录 rmdir /usr/myData
chmod 设置文件的存取权限 chmod 777 myCC.sh
fdisk 查看文件系统 fdisk –l
mount 装载文件系统 mount /dev/sda0 /mnt/usb
umount 卸载文件系统 umount /mnt/usb
pwd 显示当前工作目录 pwd
ps 显示当前运行的进程 ps –a
kill 删除运行中的进程 kill 3685
cc基本使用实例
用法 结果说明
cc ex2.c 编译后生成可执行目标文件a.out
cc –o ex2 ex2.c 编译后生成可执行目标文件ex2
cc –I/mnt/usb /include ex2.c 编译器编译过程除了在默认路径、还可以在指定的路径/mnt/usb/include下查找源文件包含的头文件
cc –L/mnt/usb/lib ex2.c 编译器在自动连接时,除了在默认路径、还可以在指定的路径/mnt/usb/lib下查找源文件用到的库文件.
另外在命令状态下:
DD :剪切一行 NDD :剪切N行 DW :剪切一个单词 NDW :剪切N个单词 P :粘贴 YY :复制一行 NYY :复制N行 YW:复制一个单词 NYW :复制N个单词
虚拟机里linux对u盘的操作
首先在终端输入:
fdisk –l
然后会看到下面的信息:红线所画的就是我们的优盘
接下来,创建一个文件夹用于映射u盘,具体命令如下:
mkdir dinglin
mount /dev/sdb1 dinglin
(dev表示device,sdb1就是优盘的编号,这句话表示吧优盘映射到dinglin文件夹)
现在,已经成功把优盘映射到dinglin文件夹
然后输入以下命令,进入优盘并查看文件
Cd dinglin
Ls
(从图片中可以看到我们需要的两个文件:cnt.c,svr.c)
接下来要做的便是把文件备份一下,具体操作如下:
输入以下代码:
Cd root
Mkdir disk
Cp /root/dinglin/cnt.c /root/disk
Cp /root/dinglin/svr.c /root/disk
Cd disk
Ls
第一句,因为刚刚我们通过cd dinglin进入了U盘,所以现在要返回root文件夹下面,不然文件夹就建到了U盘里面
第2句:因为新终端默认打开的是root文件夹,这句话表示在root文件夹下面新建了disk文件夹
第3、4句:虽然我们已经新建了disk,但是我们还在root文件夹下面,所以要输入完整的路径才能把文件复制到指定文件夹,/root/dinglin/svr.c表示源文件位置,/root/disk表示目标路径
在复制文件的时候还有其他种方法,这里就不贴图了
Cd /root
Mkdir disk
Cd dinglin
Cp cnt.c /root/disk
Cd /root/disk
这种方法是进入U盘把文加复制过去,因为进入了dinglin文件夹,所以不需要输入完整的文件源地址
现在,可以开始编译和运行了,操作如下
Cc –o cnt cnt.c
Ls
./cnt
第一句表示把cnt.c编译问指定文件名的程序,第一个cnt就是编译后的文件的名称,后面的cnt.c是我们的源文件
通过ls命令。我们看到文件夹里面多出一个cnt的文件,现在,直接输入./cnt运行就可以了
运行完毕之后就是卸载U盘了,操作如下
Cd /root
Umount dinglin
因为我们在root下面建的dinglin,所以必须返回root才能umount,如果显示device is busy,说明你可能有其他终端打开了U盘而没有退出去,直接把其他终端关闭,在执行一次就ok了
三、消息队列通信
消息机制提供四个系统调用,分别是:
int msgget(key_t key, int msgflg);
int msgsnd(int msgqid, struct msgbuf *msgp, size_t msgsz, int msgflg)
int msgrcv(int msgqid, struct msgbuf *msgp, size_t msgsz, long msgtyp, int msgflg)
int msgctl(int msgqid, int cmd, struct msgqid_ds *buf)
注意:在使用各种通信机制的系统调用前,必须include三个头文件:
<sys/types.h><sys/ipc.h><sys/msg.h>
1)int msgget(key_t key, int msgflg);
参数KEY是一个键值,由FTOK获得;MSGFLG参数是一些标志位。该调用返回与健值KEY相对应的消息队列描述字。
在以下两种情况下,该调用将创建一个新的消息队列:
?如果没有消息队列与健值KEY相对应,并且MSGFLG中包含了IPC_CREAT标志位;
?KEY参数为IPC_PRIVATE;
参数MSGFLG可以为以下:IPC_CREAT、IPC_EXCL、IPC_NOWAIT或三者的或结果。
调用返回:成功返回消息队列描述字,否则返回-1。
注:参数KEY设置成常数IPC_PRIVATE并不意味着其他进程不能访问该消息队列,只意味着即将创建新的消息队列。
2)int msgrcv(int msgqid, struct msgbuf *msgp, size_t msgsz, long msgtyp, int msgflg)
该系统调用从msgid代表的消息队列中读取一个消息,并把消息存储在msgp指向的msgbuf结构中。
msqid为消息队列描述字;消息返回后存储在msgp指向的地址,msgsz指定msgbuf的mtext成员的长度(即消息内容的长度),msgtyp为请求读取的消息类型;读消息标志msgflg可以为以下几个常值的或:
?IPC_NOWAIT 如果没有满足条件的消息,调用立即返回,此时,errno=ENOMSG
?IPC_EXCEPT 与msgtyp>0配合使用,返回队列中第一个类型不为msgtyp的消息
?IPC_NOERROR 如果队列中满足条件的消息内容大于所请求的msgsz字节,则把该消息截断,截断部分将丢失。
msgrcv手册中详细给出了消息类型取不同值时(>0; <0; =0),调用将返回消息队列中的哪个消息。
msgrcv()解除阻塞的条件有三个:
1.消息队列中有了满足条件的消息;
2. msqid代表的消息队列被删除;
3.调用msgrcv()的进程被信号中断;
调用返回:成功返回读出消息的实际字节数,否则返回-1。
3)int msgsnd(int msgqid, struct msgbuf *msgp, size_t msgsz, int msgflg)
向msgid代表的消息队列发送一个消息,即将发送的消息存储在msgp指向的msgbuf结构中,消息的大小由msgze指定。
对发送消息来说,有意义的msgflg标志为IPC_NOWAIT,指明在消息队列没有足够空间容纳要发送的消息时,msgsnd是否等待。造成msgsnd()等待的条件有两种:
?当前消息的大小与当前消息队列中的字节数之和超过了消息队列的总容量;
?当前消息队列的消息数(单位"个")不小于消息队列的总容量(单位"字节数"),此时,虽然消息队列中的消息数目很多,但基本上都只有一个字节。
调用返回:成功返回0,否则返回-1。
4)int msgctl(int msgqid, int cmd, struct msgqid_ds *buf)
该系统调用对由msqid标识的消息队列执行cmd操作,共有三种cmd操作:IPC_STAT、IPC_SET 、IPC_RMID。
1. IPC_STAT:该命令用来获取消息队列信息,返回的信息存贮在buf指向的msqid结构中;
2. IPC_SET:该命令用来设置消息队列的属性,要设置的属性存储在buf指向的msqid结构中;可设置属性包括:msg_perm.uid、msg_perm.gid、msg_perm.mode以及msg_qbytes,同时,也影响msg_ctime成员。
3. IPC_RMID:删除msqid标识的消息队列;
调用返回:成功返回0,否则返回-1。
四、消息队列应用实例
(1)题目:基于通信的字符串传递,实现在客户端输入一个字符串,服务器端进行倒序,再到客户端输出。
client.c
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/msg.h>
#define MSGKEY 75
struct msgform
{
long mtype;
char sour[256];
char dest[256];
int sour_pid;
char mtext[256];
};
int length = sizeof(struct msgform)-sizeof(long);
main()
{
struct msgform msg;
int msgqid,pid;
msgqid = msgget(MSGKEY,0777);
printf("msgqid=%d\n",msgqid);
pid=getpid();
printf("input string :");
scanf("%s",&msg.sour);
msg.sour_pid = pid;
msg.mtype=1;
msgsnd(msgqid,&msg,length,0);
msgrcv(msgqid,&msg,length,msg.sour_pid,0);
printf("client: msgqid = %d\n",msgqid);
printf("receive from pid = %d\n",msg.sour_pid);
printf("receive string is %s\n",msg.dest);
}
server.c
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/msg.h>
#define MSGKEY 75
struct msgform
{
long mtype;
char sour[256];
char dest[256];
int sour_pid;
char mtext[256];
}msg;
int msgqid;
int length = sizeof(struct msgform)-sizeof(long);
main()
{
int i,pid;
extern cleanup();
for(i=0;i<20;i++)
signal(i,cleanup);
msgqid = msgget(MSGKEY,0777|IPC_CREAT);
printf("server is ready ... \npid = %d\n",getpid());
for(;;)
{
msgrcv(msgqid,&msg,length,1,0);
printf("server: receive from pid=%d\n",msg.sour_pid);
printf("client string is %s\n",msg.sour);
msg.mtype = msg.sour_pid;
msg.sour_pid = getpid();
int j = 0;
int len = strlen(msg.sour);
for(i=len-1;i>=0;i--)
msg.dest[j++] = msg.sour[i];
printf("string is %s\n",msg.dest);
msgsnd(msgqid,&msg,length,0);
}
}
cleanup(){
msgctl(msgqid,IPC_RMID,0);
exit(0);
}
(2)两个进程利用通信进行协作,实现简单的四则运算。一个进程称为客户进程(Client),其任务是从键盘上接收3个参数:两个操作数和一个运算操作符,然后把这3个参数发送给另一个进程,即服务器进程(Server);服务器进程接收客户进程的请求,并根据提供的运算操作符,对两个操作数进行运算,服务器把运算的结果返回给客户。
client:
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/msg.h>
#define MSGKEY 75
struct msgform
{
long mtype;
float a,b,result;
char f[3];
int sour_pid;
};
int length = sizeof(struct msgform)-sizeof(long);
main()
{
struct msgform msg;
int msgqid,pid;
msgqid = msgget(MSGKEY,0777);
pid=getpid();
printf("input a = ");
scanf("%f",&msg.a);
printf("input b = ");
scanf("%f",&msg.b);
printf("input operator = ");
scanf("%s",&msg.f);
if(msg.f[0]=='/' && msg.b==0) {
printf("Error\n");
return 0; }
msg.sour_pid = pid;
msg.mtype=1;
msgsnd(msgqid,&msg,length,0);
msgrcv(msgqid,&msg,length,msg.sour_pid,0);
printf("result = %f\n",msg.result);}
server:
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/msg.h>
#define MSGKEY 75
struct msgform{
long mtype;
float a,b,result;
char f[3];
int sour_pid;};
int msgqid;
int length = sizeof(struct msgform)-sizeof(long);
main()
{
struct msgform msg;
int i,pid;
extern cleanup();
for(i=0;i<20;i++)
signal(i,cleanup);
msgqid = msgget(MSGKEY,0777|IPC_CREAT);
printf("server is waiting...\n");
for(;;)
{
msgrcv(msgqid,&msg,length,1,0);
printf("a = %f\n",msg.a);
printf("b = %f\n",msg.b);
printf("f = %s\n",msg.f);
if(msg.f[0]=='+')
msg.result =msg. a+msg.b;
else if(msg.f[0]=='-')
msg.result = msg.a-msg.b;
else if(msg.f[0]=='*')
msg.result = msg.a*msg.b;
else if(msg.f[0]=='/')
msg.result = msg.a/msg.b;
msg.mtype = msg.sour_pid;
msg.sour_pid = getpid();
printf("%f %s %f = %f\n",msg.a,msg.f,msg.b,msg.result);
msgsnd(msgqid,&msg,length,0);}}
cleanup(){
msgctl(msgqid,IPC_RMID,0);
exit(0);}
实验心得:每一次课程设计度让我学到了在平时课堂不可能学到的东西。所以我对每一次课程设计的机会都非常珍惜。不一定我的课程设计能够完成得有多么完美,但是我总是很投入的去研究去学习。总结一下有以下体会。
1、同学间的讨论,这是很重要的。老师毕竟比较忙。对于课程设计最大的讨论伴侣应该是同学了。能和学长学姐讨论当然再好不过了,没有这个机会的话,和自己班上同学讨论也是能够受益匪浅的。大家都在研究同样的问题,讨论起来,更能够把思路理清楚,相互帮助,可以大大提高效率。
2、敢于攻坚,越是难的问题,越是要有挑战的心理。这样就能够达到废寝忘食的境界。当然这也是不提倡熬夜的,毕竟有了精力才能够打持久战。但是做课设一定要有状态,能够在吃饭,睡觉,上厕所都想着要解决的问题,这样你不成功都难。
3、最好在做课设的过程中能够有记录的习惯,这样在写实验报告时能够比较完整的回忆起中间遇到的各种问题。比如当时我遇到我以前从未遇到的段错误的问题,让我都不知道从何下手。在经过大量的资料查阅之后,我对段错误有了一定的了解,并且能够用相应的办法来解决。