华中科技大学计算机学院操作系统课程设计报告[1]
操作系统第1章-第4章(华中科技大学版)_OK

2. 实时处理的类型
(1) 实时控制(必须物理实时) 如生产过程控制、作战指挥等。
(2) 实时信息处理(可以逻辑实时)
3. 实如时订操票作系系统统、的情报特检点索等。
• 及时响应 • 高可靠性和安全性 • 系统的整体性强 ★
22
操作系统的进一步发展
手工操 作阶段
联机 批处理
脱机 批处理
批处理
传输数据): 便将另一道程序投入运行。
★
12
(2) 多道运行的特征 • 多道 • 宏观上并行 • 微观上串行 执行系统采用多道程序设计技术后,就形成
了操作系统。
★
13
手工操 作阶段
联机 批处理
脱机 批处理
批处理
执行 系统
多道程序系统 多道批 分时 处理系统 系统 实时系统 操作系统形成
问题:只有一个CPU,在内存中运行的每一个程序 如何才能得到CPU 、并保持对其的占有的呢? ★
40
二、微机存储器的结构
速度快 成本高 容量小
指令 CACHE
数据
CACHE
ห้องสมุดไป่ตู้
内存
★
外存
CPU
41
CASH与内存的分组数据交换
块号
0 512B 1 512B
…… 31 512B
·· ··
m 5·12·B m+1 512B
块号
512B 0
512B 1
CPU
……
512B 31
CACHE
问题:在CPU上执行的有
因此,也称为交互式系统。
3. 分时操作系统的特点 • 多路调制性 (一台主机与多个用户终端设备相连接) • 独占性 • 交互性 ★
华科操作系统实验

华科操作系统实验 Corporation standardization office #QS8QHH-HHGX8Q8-GNHHJ8课程实验报告课程名称:操作系统课程设计专业班级:学号:姓名:指导教师:报告日期:计算机科学与技术学院目录实验1:进程并发实验1.1 实验概述通过本次进程并发实验,让同学更加熟悉和理解Linux编程环境。
1.2 实验内容本次实验的内容主要分为两个任务:1.编写一个C程序,用read、write等系统调用实现文件拷贝功能。
命令形式:copy <源文件名> <目标文件名>2. 编写一个C程序,使用图形编程库 (QT/GTK)分窗口显示三个并发进程的运行(一个窗口实时显示当前系统时间,一个窗口循环显示0到9,一个窗口做1到1000的累加求和,刷新周期均为1秒)。
1.3 实验设计任务1:实验1的第一个阶段需要实现一个简单的C语言程序,首先需要有一个复制的源文件,同时需要创建一个存放复制内容的复制文件,文件复制传输的中间站可以设置一个缓冲数组,此次试验设计了一个大小为10个字节的数组。
打开复制源文件,返回一个INT标识,使用readbuf()函数,每次读取10个字节的内容,将内容存放到缓冲区数组,使用writebuf()函数将缓冲区的10个字节写到复制文件中,重复上述过程直到将整个复制过程完成。
任务2:实验的第二个阶段是实现进程的同步,实现的工具是QT。
主要实现3个进程的同步,3个进程分别为:实时显示系统时间、循环显示0-9、显示1-1000的累加和。
以上程序的刷新时间设置为1秒钟。
使用的是c++编程语言。
为了实现3个进程。
需要为这3个进程分别创建3个不同的类,这3个不用的类具有不同的成员函数,使用成员函数来实现进程的所代表的具体细节。
为了实现进程的结果能实时更新,需要调用connect()函数,该函数的功能是每当其中的timer每次发生变化时,就回调用该类的成员函数,也就是进程的具体实现,从而实时显示进程的细节内容。
操作系统实验报告--华科

实验一哲学家就餐问题一、实验目的1、熟练使用VC++6.0编译环境,调试并正确运行程序。
2、理解哲学家就餐问题中出现的问题,进而掌握死锁的必要条件。
3、理解源程序中产生和防止死锁的算法,及相关窗口操作。
4、熟悉哲学家就餐问题流程。
5、在VC++6.0环境下编译哲学家就餐问题演示程序,考虑其他解决死锁方法.二、实验原理1、问题描述有五个哲学家围坐在一圆桌旁,桌中央有一盘通心粉,每人面前有一只空盘子,每两人之间放一只筷子。
每个哲学家的行为是思考,感到饥饿,然后吃通心粉。
为了吃通心粉,每个哲学家必须拿到两只筷子,并且每个人只能直接从自己的左边或右边去取筷子。
2、分配方式方式一(不会进入死锁)仅当一个哲学家左右两边的筷子都可用时,才允许他拿筷子。
这样要么一次占有两只筷子(所有线程需要的资源)进行下一步的吃通心粉,然后释放所有的资源;要么不占用资源,这样就不可能产生死锁了。
方式二(会进入死锁)当筷子(资源)可用时,先分配左边的筷子,等待一会后再分配右边的筷子,由于这个过程中,左边的筷子一直没有释放,就有可能产生死锁了。
3、程序运行说明程序运行过程中会弹出一个MessageBox提示操作者操作:1)第一个对话框用于选择运行模式a.选择yes 表示采用的是运行的防止死锁的方式,这样的话整个程序可以一直运行下去,不会产生死锁。
b.选择no 表示运行产生死锁的方式会弹出第二个对话框。
2)第二个对话框用于选择运行时,线程运行的时间a. 选择res 线程时间比较短,很快就可以死锁b.选择no 线程时间跟选择yes 时候的时间差不多,产生死锁的时间稍微长一点。
三、实验过程及分析1、伪代码:1) 不发生死锁的方式(要么一下占用两支筷子,要么不占用)var mutexleftchopstick,mutexrightchopstick;beging:resting;waiting;p(mutexleftchopstick); //先改变左手筷子信号量p(mutexrightchopstick); //马上改变右手筷子信号量GetResource(leftchopstick,rightchopstick);eating;v(mutexleftchopstick);v(mutexrightchopstick);end2) 发生死锁的方式(一旦可以占用筷子,就马上占用)var mutexleftchopstick,mutexrightchopstick;beging:resting;waiting;p(mutexleftchopstick); //改变左手筷子信号量GetResource(leftchopstick); //获取左手筷子p(mutexrightchopstick); //改变右手筷子信号量GetResource(rightchopstick); //获取右手筷子eating;v(mutexleftchopstick);v(mutexrightchopstick);end2、代码分析:1)不发生死锁的方式:先确定两只筷子均没被占用才获取筷子,这样就打破了死锁的必要条件。
《操作系统》课程设计报告

长江大学操作系统课程设计报告系(院):计算机科学学院专业班级:软工******姓名: ******* ***学号: 2013*****指导教师: *** **设计时间: 2015.12.27 - 2016.1.5设计地点: 4教5楼机房目录一、基本要求 (3)二、课程设计内容 (3)三、运行环境 (3)四、算法原理 (3)4.1银行家算法原理 (3)4.2页面置换算法原理 (3)4.3电梯调度算法原理 (4)五、程序结构 (4)5.1银行家算法结构 (4)5.2页面置换算法结构 (5)5.3电梯调度算法结构 (6)六、核心代码 (7)6.1银行家算法核心代码 (7)6.2页面置换算法核心代码 (13)6.3电梯调度算法核心代码 (17)七、运行结果截图 (20)7.1银行家算法截图 (20)7.2页面置换算法截图 (21)7.3电梯调度算法截图 (22)八、总结 (23)一、基本要求1.熟悉操作系统原理知识,理解各类管理算法。
2.能根据具体问题的数据特点,选用适当的数据结构,实现数据的组织和管理。
3.进一步巩固程序设计与数据结构的实践技能。
二、课程设计内容1.银行家算法模拟;2.页面置换算法模拟(OPT,FIFO,LRU);3.电梯调度算法(磁盘调度)模拟。
三、运行环境编程语言:C++,编程软件Microsoft Visual C++6.0,操作系统:Windows7。
四、算法原理4.1银行家算法原理银行家算法:系统中有限的资源要供多个进程使用,必须保证得到的资源的进程能在有限的时间内归还资源,以供其他进程使用资源。
如果资源分配不得到就会发生进程循环等待资源,则进程都无法继续执行下去的死锁现象。
把一个进程需要和已占有资源的情况记录在进程控制中,假定进程控制块PCB其中“状态”有就绪态、等待态和完成态。
当进程在处于等待态时,表示系统不能满足该进程当前的资源申请。
”资源需求总量”表示进程在整个执行过程中总共要申请的资源量。
华科操作系统实验

课程实验报告课程名称:操作系统课程设计专业班级:学号:姓名:指导教师:报告日期:计算机科学与技术学院目录实验1:进程并发实验 (1)实验概述 (1)实验内容 (1)实验设计 (1)实验过程 (2)实验结果 (6)实验小结 (7)实验2:添加系统功能调用 (8)实验概述 (8)实验内容 (8)阶段1 添加源代码 (8)阶段2 连接新的系统功能调用 (9)阶段3 重建内核 (10)阶段4 修改grub文件 (13)实验小结 (14)实验3:添加设备驱动程序 (15)实验概述 (15)实验内容 (15)阶段1 编写设备驱动程序 (15)阶段2 编译设备驱动模块 (16)阶段3 加载设备驱动模块 (17)阶段4 生成设备文件 (18)阶段5 编写应用程序测试 (18)实验小结 (19)实验总结 (20)实验1:进程并发实验实验概述通过本次进程并发实验,让同学更加熟悉和理解Linux编程环境。
实验内容本次实验的内容主要分为两个任务:1.编写一个C程序,用read、write等系统调用实现文件拷贝功能。
命令形式:copy <源文件名> <目标文件名>2.编写一个C程序,使用图形编程库 (QT/GTK)分窗口显示三个并发进程的运行(一个窗口实时显示当前系统时间,一个窗口循环显示0到9,一个窗口做1到1000的累加求和,刷新周期均为1秒)。
实验设计任务1:实验1的第一个阶段需要实现一个简单的C语言程序,首先需要有一个复制的源文件,同时需要创建一个存放复制内容的复制文件,文件复制传输的中间站可以设置一个缓冲数组,此次试验设计了一个大小为10个字节的数组。
打开复制源文件,返回一个INT标识,使用readbuf()函数,每次读取10个字节的内容,将内容存放到缓冲区数组,使用writebuf()函数将缓冲区的10个字节写到复制文件中,重复上述过程直到将整个复制过程完成。
任务2:实验的第二个阶段是实现进程的同步,实现的工具是QT。
华科操作系统课程设计

华科操作系统课程设计一、教学目标本课程的教学目标分为知识目标、技能目标和情感态度价值观目标。
知识目标:学生需要掌握操作系统的基本概念、原理和关键技术,包括进程管理、内存管理、文件系统、输入/输出系统等。
技能目标:学生能够运用操作系统的基本原理和关键技术,分析和解决实际问题。
通过实验和项目,培养学生的动手能力和创新能力。
情感态度价值观目标:培养学生对操作系统的兴趣和热情,提高学生的问题意识和团队协作精神。
二、教学内容本课程的教学内容主要包括操作系统的基本概念、原理和关键技术。
1.操作系统概述:操作系统的定义、功能、分类和发展历程。
2.进程管理:进程的概念、进程控制块、进程调度、同步与互斥、死锁。
3.内存管理:内存分配与回收策略、内存保护、虚拟内存、页面置换算法。
4.文件系统:文件和目录的概念、文件系统的结构、文件访问控制、磁盘空间分配策略。
5.输入/输出系统:输入/输出设备管理、中断处理、直接存储器访问(DMA)、设备驱动程序。
三、教学方法本课程采用多种教学方法,包括讲授法、讨论法、案例分析法和实验法。
1.讲授法:用于传授基本概念和原理,引导学生掌握操作系统的核心知识。
2.讨论法:通过小组讨论,培养学生的思考能力和团队协作精神。
3.案例分析法:分析实际案例,让学生了解操作系统在实际应用中的工作原理和解决问题的方式。
4.实验法:动手实践,培养学生的实际操作能力和创新能力。
四、教学资源本课程的教学资源包括教材、参考书、多媒体资料和实验设备。
1.教材:选用国内知名出版社出版的操作系统教材,如《操作系统原理与实践》。
2.参考书:提供相关领域的经典著作和最新研究成果,供学生拓展阅读。
3.多媒体资料:制作课件、视频等资料,辅助教学,提高学生的学习兴趣。
4.实验设备:配置相应的实验设备,如计算机、网络设备等,为学生提供实践操作的机会。
五、教学评估本课程的评估方式包括平时表现、作业、考试等。
1.平时表现:评估学生的课堂参与度、提问回答、小组讨论等,以考查学生的学习态度和思考能力。
华中科技大学计算机系统基础实验报告

课程实验报告课程名称:计算机系统基础专业班级:学号:姓名:指导教师:报告日期:2016年5月24 日计算机科学与技术学院目录实验1: (2)实验2: (9)实验3: (22)实验总结 (30)实验1:数据表示1.1 实验概述本实验的目的是更好地熟悉和掌握计算机中整数和浮点数的二进制编码表示。
实验中,你需要解开一系列编程“难题”——使用有限类型和数量的运算操作实现一组给定功能的函数,在此过程中你将加深对数据二进制编码表示的了解。
实验语言:c; 实验环境: linux1.2 实验内容需要完成bits.c 中下列函数功能,具体分为三大类:位操作、补码运算和浮点数操作。
1.3 实验设计源码如下:/** lsbZero - set 0 to the least significant bit of x* Example: lsbZero(0x87654321) = 0x87654320* Legal ops: ! ~ & ^ | + << >>* Max ops: 5* Rating: 1*/int lsbZero(int x) {//x右移一位再左移一位实现把最低有效位置0x = x>>1;x = x<<1;return x;}/** byteNot - bit-inversion to byte n from word x* Bytes numbered from 0 (LSB) to 3 (MSB)* Examples: getByteNot(0x12345678,1) = 0x1234A978* Legal ops: ! ~ & ^ | + << >>* Max ops: 6* Rating: 2*/int byteNot(int x, int n) {//x第n个字节每位都和1异或实现取反int y = 0xff;n = n<<3;y = y<<n;x = (x^y);return x;}/** byteXor - compare the nth byte of x and y, if it is same, return 0, if not, return 1* example: byteXor(0x12345678, 0x87654321, 1) = 1* byteXor(0x12345678, 0x87344321, 2) = 0* Legal ops: ! ~ & ^ | + << >>* Max ops: 20* Rating: 2*/int byteXor(int x, int y, int n) {//把x和y的第n个字节取出来异或,再转换为逻辑的0和1n = n<<3;x = x>>n;y = y>>n;x = x&(0xff);y = y&(0xff);return !!(x^y);}/** logicalAnd - x && y* Legal ops: ! ~ & ^ | + << >>* Max ops: 20* Rating: 3*/int logicalAnd(int x, int y) {//把x和y分别转化为逻辑的0和1,再相与x = (!(!x))&(!(!y));return x;}/** logicalOr - x || y* Legal ops: ! ~ & ^ | + << >>* Max ops: 20* Rating: 3*/int logicalOr(int x, int y) {//把x和y分别转化为逻辑的0和1,再相或x = (!(!x))|(!(!y));return x;}/** rotateLeft - Rotate x to the left by n* Can assume that 0 <= n <= 31* Examples: rotateLeft(0x87654321,4) = 0x76543218* Legal ops: ~ & ^ | + << >> !* Max ops: 25* Rating: 3*/int rotateLeft(int x, int n) {//先构造低n位为1,高(32-n)位为0的数z,x左移n位后的数加上x右移(32-n)位的数&z即可int z;z = ~(((1<<31)>>31)<<n);x = ((x>>(32+(~n+1)))&z)+(x<<n);return x;}/** parityCheck - returns 1 if x contains an odd number of 1's* Examples: parityCheck(5) = 0, parityCheck(7) = 1* Legal ops: ! ~ & ^ | + << >>* Max ops: 20* Rating: 4*/int parityCheck(int x) {//每次将数的低半数位与高半数位比较,再把y右移31位,最后把y转化为逻辑的0和1int y;y = x<<16;y = y^x;y = y^(y<<8);y = y^(y<<4);y = y^(y<<2);y = y^(y<<1);y = y>>31;return !(!y);}/** mul2OK - Determine if can compute 2*x without overflow* Examples: mul2OK(0x30000000) = 1* mul2OK(0x40000000) = 0** Legal ops: ~ & ^ | + << >>* Max ops: 20* Rating: 2*/int mul2OK(int x) {//把x第31位和30位分别和1做按位与,再异或,再和1异或int m;m = ((x>>31)&0x1)^((x>>30)&0x1);return m^0x1;}/** mult3div2 - multiplies by 3/2 rounding toward 0,* Should exactly duplicate effect of C expression (x*3/2),* including overflow behavior.* Examples: mult3div2(11) = 16* mult3div2(-9) = -13* mult3div2(1073741824) = -536870912(overflow)* Legal ops: ! ~ & ^ | + << >>* Max ops: 12* Rating: 2*/int mult3div2(int x) {//左移一位再+x即x*3,右移一位的时候,当y的最高位和最低位都为0时还要+1int y = (x<<1)+x;y = (y>>1)+(((y>>31)&1)&(((y<<31)>>31)&1));return y;}/** subOK - Determine if can compute x-y without overflow* Example: subOK(0x80000000,0x80000000) = 1,* subOK(0x80000000,0x70000000) = 0,* Legal ops: ! ~ & ^ | + << >>* Max ops: 20* Rating: 3*/int subOK(int x, int y) {//x的最高有效位和y的最高有效位不同且x和(x-y)的最高位不同才能判断溢出int m = (x>>31)&1;int n = (y>>31)&1;x = (m^n)&(m^(((x+(~y+1))>>31)&1));return (!x);}/** absVal - absolute value of x* Example: absVal(-1) = 1.* You may assume -TMax <= x <= TMax* Legal ops: ! ~ & ^ | + << >>* Max ops: 10* Rating: 4*/int absVal(int x) {//x最高位为0时就是x,最高位为1时是~x+1int y = x>>31;x = (y&(~x+1))+((~y)&x);return x;}/** float_abs - Return bit-level equivalent of absolute value of f for * floating point argument f.* Both the argument and result are passed as unsigned int's, but * they are to be interpreted as the bit-level representations of * single-precision floating point values.* When argument is NaN, return argument..* Legal ops: Any integer/unsigned operations incl. ||, &&. also if, while* Max ops: 10* Rating: 2*/unsigned float_abs(unsigned uf) {int x=uf&(~(1<<31));if(x>0x7f800000){return uf;}else return x;}/** float_f2i - Return bit-level equivalent of expression (int) f* for floating point argument f.* Argument is passed as unsigned int, but* it is to be interpreted as the bit-level representation of a* single-precision floating point value.* Anything out of range (including NaN and infinity) should return * 0x80000000u.* Legal ops: Any integer/unsigned operations incl. ||, &&. also if, while* Max ops: 30* Rating: 4*/int float_f2i(unsigned uf) {unsigned num=0x80000000;int x=(uf&0x007fffff)^0x00800000;int order=0;order=(uf&0x7f800000)>>23;if(order>158){return num;}if(order<127) return 0;else if(((uf>>31)&1)==1){if(order>150){return ~(x<<(order-150))+1;}else return ~(x>>(150-order))+1;}else{if(order>150) return x<<(order-150);else return x>>(150-order);}}1.4 实验过程编写源码,运行btest,得出实验结果。
华中科技大学-计算机学院-数据结构实验报告

华中科技大学-计算机学院-数据结构实验报告LT目录1基于顺序存储结构实现线性表的基本运算 (1)1.1 实验目的 (1)1.2 线性表演示系统设计 (1)1.2.1 系统总体设计 (1)1.2.2 有关常量和类型定义 (1)1.2.3 算法设计 (1)1.3 线性表演示系统实现与测试 (3)1.3.1 系统实现 (3)1.3.2 系统测试 (11)1.4 实验小结 (12)2 基于链式实现线性表的基本运算 (13)2.1 问题描述 (13)2.2 线性表演示系统设计 (13)2.2.1 系统总体设计 (13)2.2.2 有关常量和类型定义 (13)2.2.3 算法设计 (13)2.3 线性表演示系统实现与测试 (15)2.3.1 系统实现 (15)2.3.2 系统测试 (24)2.4 实验小结 (25)3基于顺序存储结构实现栈的基本运算 (27)3.1实验目的 (27)3.2栈演示系统设计 (27)3.2.1 系统总体设计 (27)3.2.2 算法实现 (27)3.3 栈演示系统实现与测试 (28)3.3.1 程序实现 (28)3.3.2 系统测试 (34)3.4 实验小结 (35)4基于循环队列存储结构实现队列的基本运算 (36)4.1 问题描述 (36)4.2.1 系统总体设计 (36)4.2.2 有关常量和类型定义 (36)4.2.3 算法设计 (36)4.3 队列演示系统实现与测试 (37)4.3.1 系统实现 (37)4.3.2 系统测试 (44)4.4 实验小结 (45)5基于二叉链表实现二叉树的基本运算 (46)5.1 实验目的 (46)5.2.1 系统总体设计 (46)5.2.2 有关常量和类型定义 (46)5.2.3 算法设计 (46)5.3 二叉树演示系统实现与测试 (48)5.3.1 系统实现 (48)5.3.2 系统测试 (79)5.4 实验小结 (81)6基于邻接表实现图的基本和常见运算 (82)6.1 实验目的 (82)6.2.1 系统总体设计 (82)6.2.2 有关常量和类型定义 (82)6.2.3 算法设计 (82)6.3 图演示系统实现与测试 (83)6.3.1 系统实现 (83)6.3.2 系统测试 (101)6.4 实验小结 (103)参考文献 (104)1基于顺序存储结构实现线性表的基本运算1.1 实验目的通过实验达到:(1)加深对线性表的概念、基本运算的理解;(2)熟练掌握线性表的逻辑结构与物理结构的关系;(3)物理结构采用顺序表,熟练掌握线性表的基本运算的实现。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
华中科技大学嵌入式操作系统课程设计实验报告院系: 计算机科学与技术学院专业:班级:姓名:指导老师:报告时间:计算机科学与技术学院目录1.课程设计目的 (3)2.课程设计环境搭建 (3)3.内容一:熟悉和理解Linux编程环境3.1 内容要求 (5)3.2 设计过程及实现 (5)4.内容二:掌握添加系统调用的方法4.1 内容要求 (9)4.2 设计过程及实现 (9)5.内容三:掌握添加设备驱动程序的方法5.1 内容要求 (17)5.2 设计过程及实现 (17)6.内容四:理解和分析/proc文件6.1 内容要求 (22)6.2 设计过程及实现 (22)1 课程设计目的(1)掌握Linux操作系统的使用方法;(2)了解Linux系统内核代码结构;(3)掌握实例操作系统的实现方法。
2 课程设计环境搭建(1)windows 7上,利用虚拟机软件VMware软件搭建的linux平台:◎Ubuntu 11.10 (安装包:ubuntu-11.10-desktop-i386)◎内核:linux-headers-3.0.0-12-generic(2)更改root登录:在现阶段Ubuntu的系统中,是不允许直接以root身份登录系统的,但是在做课设的过程中,需要大量的使用root权限来进行命令的操作。
如果以普通用户登录ubuntu,会连编辑一个文件都非常周折。
为此,我找到了一种修改系统文件,以达到直接使用root身份登录的方法:◎开始的时候,只能以普通用户登录,用Ctrl+Alt+T打开终端:初始化/修改root密码sudo passwd root用vi编辑器修改这个文件:sudo vi /etc/lightdm/lightdm.conf在文件最后加入这么一行代码:greeter-show-manual-login=true然后保存退出,sudo reboot 重启系统。
之后就可以输入root用户登录。
(3)在添加系统调用中用到的其他内核包:◎下载和当前实验环境最为接近的系统版本(这点很重要)使用apt-get install linux-source-3.0.0 命令,◎下载结果是linux-source-3.0.0.tar.bz2◎解压命令:tar –xjvf linux-source-3.0.0.tar.bz2 –C /usr/src ◎解压后,在/usr/src目录下得到内核文件夹linux-source-3.0.0(4)在调用linux图形库时需要安装GTK环境:◎安装gcc/g++/gdb/make 等基本编程工具apt-get install build-essentialTip:如果提示由于依赖项不能安装,需要使用apt的强化版aptitude,这个工具可以自动分析软件包依赖,系统一般不自带,需要先安装,具体过程是:apt-get install aptitudeaptitude install build-essentialaptitude这个工具很强大,对于解决软件包安装时的依赖问题很有帮助。
◎安装 libgtk2.0-dev libglib2.0-dev 等开发相关的库文件:apt-get install gnome-core-devel◎安装GTK核心组件:apt-get install libgtk2.0-dev这个安装完成后,GTK环境就基本搭建成功,网上有些教程说要安装其他配置文件,经我亲测,发现只要安装libgtk2.0-dev这个包就能搞定。
3 内容一:熟悉和理解Linux编程环境3.1 内容要求(1)编写一个C程序,实现文件拷贝功能(2)编写一个C程序,使用Linux下的图形库,分窗口显示三个并发进程运行;3.2 设计过程及实现(1)文件拷贝:①文件的拷贝主要的思想就是利用文件指针操作,在两个文件之间进行按字符的fget和fput。
从而完成整个文件的拷贝操作。
在这个基本功能之外,需要增加程序的健壮性,具体有以下几个方面:·源文件是否存在且能读取数据;·是否能创建目的文件,且能向里面写入数据;·程序需要的argc参数个数是否满足要求;②基于以上几点和内容要求,主要的程序段如下:if(argc!=3) //判断参数个数是否为3 ,否则返回{printf("Error in argc!\n");return 0;}if( (fsource=fopen(argv[1],"rb"))==NULL ){printf("Error in open source file!\n"); //判断源文件是否能打开和读出return 0;}if( (ftarget=fopen(argv[2],"wb"))==NULL ){printf("Error in open target file!\n"); //判断目的文件时候能创建和写入return 0;}while((c=fgetc(fsource))!=EOF){fputc(c,ftarget); //按字符读取和写入数据}③执行结果如下:将source/source.txt文件拷贝到到target.txt,开始时如下图3-1所示:图3-1 复制开始前source/source.txt文件内容利用mycopy程序复制,查看target.txt文件复制结果如下图3-2所示:图3-2 复制后target.txt文件的具体内容(2)实现三个进程之间的并发程序:这里需要用到课程实验时的fork( )程序以及GTK的图形显示。
①基本fork()程序,调用显示一个父进程和两个子进程的结构如下:if((pid_1=fork())==0){printf("Child 1# is running......\n"); //第一个子进程Child 1#show(argc,argv,"This is Child 1#"); //调用函数显示窗口}else{if((pid_2=fork())==0){printf("Child 2# is running......\n"); //第二个子进程Child 2#show(argc,argv,"This is Child 2#"); //调用函数显示窗口}else {printf("Parent # is running......\n"); //父进程Parent #//由于父进程需要显示全部子进程PID,所以这里直接用参数画窗口}}②调用GTK显示窗体函数模块的结构:void show(int argc,char *argv[ ],char *title ) {gtk_init (&argc, &argv); //初始化工具包并且获取命令行参数;window = gtk_window_new (GTK_WINDOW_TOPLEVEL); //创建新的窗口;//设定窗口的位置;gtk_window_set_position(GTK_WINDOW(window), GTK_WIN_POS_CENTER);//监听窗口的destroy事件;g_signal_connect (G_OBJECT (window),"destroy", G_CALLBACK (destroy_progress), NULL);gtk_window_set_title (GTK_WINDOW (window), title);//用来设定更改窗口标题;gtk_container_set_border_width (GTK_CONTAINER (window), 20);//设定宽度;//使用gtk_vbox_new函数建立纵向组装盒;//为了显示构件,必须将构件放入组装盒中,并将组装盒放在窗口内;vbox = gtk_vbox_new (FALSE, 10);gtk_container_set_border_width (GTK_CONTAINER (vbox), 100);//设定宽度;gtk_container_add (GTK_CONTAINER (window), vbox);gtk_widget_show (vbox);//使用gtk_box_pack_start函数将构件放到组装盒中;sprintf (id_char, "%s ,My ID:%d", title,getpid ()); //显示PID号label = gtk_label_new (id_char);gtk_box_pack_start (GTK_BOX (vbox), label, FALSE, FALSE, 10);gtk_widget_show (label);sprintf (id_char, "父进程ID:%d", getppid ()); //显示PPID号label = gtk_label_new (id_char);gtk_box_pack_start (GTK_BOX (vbox), label, FALSE, FALSE, 10);gtk_widget_show (label);button = gtk_button_new_with_label ("close"); //关闭窗口按钮//信号登记函数,监听按钮的clicked事件。
//当窗口clicked时,gtk_widget_destroy 就会被调用。
//而gtk_widget_destroy 函数又调用gtk_main_quit() 结束程序运行。
g_signal_connect_swapped (G_OBJECT (button), "clicked", G_CALLBACK (gtk_widget_destroy), window);gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 10);GTK_WIDGET_SET_FLAGS (button, GTK_CAN_DEFAULT);gtk_widget_grab_default (button);//函数显示窗口中的组件gtk_widget_show (button);gtk_widget_show (window);//准备将窗口和所有的组件显示在屏幕上,函数必须在GTK程序的最后调用.gtk_main ();}③编译代码forkgtk.c,运行;编译命令为:gcc -o forkgtk forkgtk.c `pkg-config --cflags --libs gtk+-2.0`程序运行结果如下图3-3所示:图3-3 三个并行显示窗口4.内容二:掌握添加系统调用的方法4.1 内容要求(1)采用编译内核的方法,添加一个新的系统调用。