Linux程序设计报告
浙江大学Linux程序设计实验报告
Linux程序设计实验报告1——操作系统基本命令使用一、实验目的1.通过对Emacs、vi、vim、gedit文本编辑器的使用,掌握在Linux环境下文本文件的编辑方法;2.通过对常用命令mkdir、cp、cd、ls、mv、chmod、rm等文件命令的操作,掌握Linux操作系统中文件命令的用法。
二、实验任务与要求1.emacs的使用,要求能新建、编辑、保存一个文本文件2.vi或vim的使用,要求能新建、编辑、保存一个文本文件3.gedit的使用,要求能新建、编辑、保存一个文本文件4.掌握mkdir、cd命令的操作,要求能建立目录、进入与退出目录5.掌握cp、ls、mv、chmod、rm命令的操作,要求能拷贝文件、新建文件、查看文件、文件重命名、删除文件等操作。
三、实验工具与准备计算机PC机,Linux Redhat Fedora Core6操作系统四、实验步骤与操作指导任务1.学习emacs的使用,要求能新建、编辑、保存一个文本文件(1)启动emacs(2)输入以下C程序(3)保存文件为kk.c(4)用emacs打开文件kk.c(5)修改程序(6)另存为文件aa.txt并退出。
任务2.vi或vim的使用,要求能新建、编辑、保存一个文本文件(1)点击”应用程序”→ “附件”→“终端”,打开终端,在终端输入命令:[root@localhost root]#vi kk.c按i键,进入插入状态。
(2)输入以下C程序#include<stdio.h>int main( ){printf(“Hello world!\n”);return 0;}此时可以用Backspace、→、←、↑、↓键编辑文本。
(3)保存文件为kk.c按Esc键,进入最后行状态,在最后行状态输入:wq保存文件,退出vi。
(4)用vi打开文件kk.c,输入命令:[root@localhost root]#vi kk.c(5)修改程序为:#include<stdio.h>int main( ){printf(" Hello world!\n");printf("*****************\n");return 0;}(6)按Esc键,进入最后行状态,在最后行状态输入:wq aa.txt保存文件,如图1所示,另存为文件aa.txt并退出vi。
Linux程序的设计实验报告
Linux程序的设计实验报告《Linux程序设计》实验指导书实验类别:课实验实验课程名称:Linux程序设计实验室名称:软件⼯程专业实验室实验课程编号: N03140112总学时:32 学分: 2适⽤专业:软件⼯程先修课程:Linux操作系统、C程序设计实验在教学培养计划中地位、作⽤:通过讲授Linux的操作使⽤、系统结构和Linux环境下的程序设计,使学⽣对Linux 操作系统获得⼀个全⾯的认识和掌握。
⼀⽅⾯,学⽣通过学习系统程序设计,能够复习操作系统中的基本概念,对⽂件管理、进程控制有更深⼊的理解;另⼀⽅⾯,学⽣学会在Linux 环境下⼯作,进⼀步熟悉C语⾔程序设计和数据结构的知识,编写进⾏系统维护的脚本⽂件和实⽤化的⼤型应⽤程序,如⽹络应⽤程序。
同时,本课程为学⽣进⼀步学习其它后续课程(如⾼级操作系统、Linux核源代码分析、嵌⼊式系统等)打下基础。
《Linux程序设计》实验⼤纲Linux Program Design课程类别:学科专业教育课程课程名称:Linux程序设计开课单位:软件学院课程编号:N03140112总学时:32 学分:2适⽤专业:软件⼯程先修课程:程序设计基础⼀、实验教学⽬标熟练掌握shell编程、熟练使⽤linux系统、掌握进程控制和进程间通信,学会编写⽹络程序,学会在linux环境中编写web程序。
养成⼀种良好的程序设计风格。
⼆、实验环境Linux三、实验教材及参考书:[1] 实验指导书(⾃编讲义)[2]《Linux环境C程序设计》徐诚⾼莹婷等清华⼤学2010.1[3]《linux⼊门到精通》忆智清华⼤学2010.1四、实验成绩评定⽅式根据学⽣在实验过程中的认真程度、上机结果验收情况以及实验报告撰写质量,进⾏综合评定。
五、实验项⽬及学时分配六、实验容及要求实验⼀ Linux基本命令的使⽤1、实验⽬的(1)学习和掌握Linux的基本命令(2)增强学⽣对Linux的学习兴趣2、实验容(1)linux的登录操作(2)常⽤基本命令的使⽤实验⼆ Shell程序设计1、实验⽬的(1).Shell程序设计中变量的使⽤;(2).理解通道的概念并初步掌握它的使⽤⽅法;(3).掌握算术操作、字符串操作、逻辑操作、⽂件操作;(4).掌握if then fi、if then elif fi、case、while、for等控制语句;(5).在shell脚本中使⽤函数;2、实验容(1).通过对shell程序的调试,理解变量$#,$0,$1,$2,$3,$@的含义;(2).Shell顺序程序设计;(3).Shell分⽀程序与多分⽀程序设计;(4).Shell循环程序设计。
linux编程实验报告doc
linux编程实验报告篇一:Linux程序设计实验报告《Linux程序设计》实验报告安徽工业大学计算机学院XX年6月1实验一 Linux基本命令的使用1、实验目的学习和掌握Linux的基本命令。
2、实验内容和步骤步骤1:以user_login用户身份并使用telnet登录Linux服务器,按照提示创建自己的账户和口令。
步骤 2:使用新创建的用户账户和口令登录Linux系统,察看登录后的界面。
步骤3:使用pwd命令察看当前的工作目录,然后用ls 命令查看当前目录下的内容,尝试使用-a,-l,-F,-A,-lF等不同选项并比较不同之处。
步骤4:在当前目录下建立一个名为test的新目录,然后将工作目录切换到test下,尝试将/etc目录下的文件passwd拷贝到该目录下(cp 源文件目的目录)。
察看当前目录下的passwd文件的属主和文件权限。
2步骤5:尝试向当前目录下的passwd文件和/etc/passwd 文件分别写入一些新内容(可使用echo “字符串” >>文件的命令),看看操作能否成功,如果不能成功,请说明原因。
用cat命令浏览文件password的内容,用more命令进行浏览翻页操作,再用less命令浏览文件的内容。
比较这几个命令的不同之处步骤6:用ls命令查看test下文件的权限,用mv命令更改文件password的文件名为test.txt,尝试用chown和chgrp更改文件的属主为root、组为root,看看能否成功,不成功,请说明原因。
尝试用chomd将文件权限为“-rw-------”。
看看能否成功,不成功,请说明原因。
3步骤7:用rm命令删除test目录下的所有文件,再用rmdir命令删除test目录。
(想一想有没有一条命令将目录及目录下的所有文件删除,写出这条命令)步骤8:使用ps命令查看当前系统内的进程,并利用man命令获取ps命令的参数,写出获取当前终端进程执行情况的ps命令。
Linux程序设计基础实验报告心得体会[实用]
Linux程序设计基础实验报告心得体会[实用]
在进行Linux程序设计基础实验的过程中,我学到了很多Linux操作系统相关的知识
和编程技巧。
本次实验囊括了Linux操作系统中常用的一些工具和命令,如gcc编译器、make工具、shell脚本等,在深入学习这些工具的同时,我也能更加熟练地运用Linux系
统进行编程。
在实验中,我学习了很多关于编译工具的知识。
gcc是Linux中常用的编译器,它支
持多种语言的编译。
make工具则可以帮助我们更加简单地进行代码构建和管理。
在实验中,我通过这些工具,可以更加高效地进行程序开发。
同时,我也学到了如何创建和调用自己的shell脚本。
shell脚本可以帮助我们更加
快速地进行一些特定的操作命令,如在系统启动时自动运行程序等等。
在编写shell脚本
的过程中,我学到了很多常用的命令,如if语句、while语句、echo命令等等,这些知识可以帮助我更加方便地进行Linux系统管理。
最后,我觉得本次实验让我更加深入地了解了Linux操作系统和编程方面的知识,同
时也锻炼了我的编程能力和实践操作能力。
在以后的学习和工作中,我会更加注意Linux
系统的应用和开发,为自己的职业发展打下坚实的基础。
Linux程序设计实验报告总结计划.docx
实验报告课程名称:Linux程序设计学院:信息科学与工程学院专业:13计算机班级:2013-1姓名:学号:2016年6月28日山东科技大学教务处制实验报告组别姓名同组实验者实验项目名称实验一熟悉linux命令实验日期教师评语第 12 周周四9,10 节实验成绩指导教师廉文娟1.登录和退出 Linux 系统用户登录系统时为了使系统能够识别自己必须输入用户名和密码经系统验证无后方能进入系统。
用户登录分两步进行,第一步输入用户的登录名,系统根据该登录名来识别用户,第二步输入用户的口令,该口令是用户自己选择的一个字符串对其他用户是保密的,是在登录时系统用来辨别真假用户的关键字。
必须输入用户的账号,分为 1)root ——系统管理员账号,该账号可以进行任意操作。
2)普通用户——拥有一定的权限2.其他命令三、实验内容常用操作命令。
1、在 Linux 系统中打开终端,利用快捷键ctrl+alt+T,打开,结果如下:2、退出:不论是 root 用户还是普通用户,需要退出系统,在 shell 提示符下,键入 exit 命令即可。
3、关机与重启:Linux 中提供了命令 shutdown,可以安全地关机或重启系统,该命令只能是超级用户可以使用,命令格式: shutdown [ 选项 ][ 时间 ][ 警告信息 ]其中警告信息是向其他用户发布的信息,时间指定关机或是重启的时间,选项的意义如下:-h关机,关机前关闭相关进程,执行fsck 命令(文件系统的一致性检查)-r系统重新启动-f快速关机,系统关机前不执行 fsck命令-n快速关机,系统关机前不执行 init命令-k不关机,只是将警告信息向其他用户发布-c终止执行正在运行的 shutdown 命令举例:1.系统立即关机shutdown–h now2.两分钟后重启系统,发布信息 System will be down in 2 minutes!给其他终端用户。
Shutdown – r +2“System will be down in 2 minutes!”除了可以使用 shutdown 命令来关机和重启系统外, Linux 还有专门用于关机和重启系统的命令 poweroff 和 reboot ,reboot 用于重启系统(相当于 shutdown –r now),命令 poweroff 则用于关机(相当于shutdown –h now)4、添加新用户、修改文件属性1.添加新用户(在 root 下,按默认值回答)adduser 用户名;如 adduser s2001 ;以新用户登录到系统2.修改用户口令passwd用户名3.控制文件属性使用 ls–l查看文件属性改变用户的所有权: chown用户名文件名改变文件权限: chmod g+w文件名;chmod o-r文件名或使用数字方式修改:如chmod 644 文件名; chmod 755 文件名u (user用户),g ( group组),o (other其他); w 写访问权限,r读访问权限, x执行权限4.查看相关命令的帮助:man 命令名5.显示当前系统中已注册的用户信息:who6.显示当前注册的用户信息:whoami5、文件显示命令显示指定工作目录中所包含的内容的指令是ls,要说明的是ls命令列出文件的名字,而不是文件的内容。
【设计】linux程序设计实验报告6
【关键字】设计linux程序设计实验报告6篇一:Linux上Shell程序设计实验报告深圳大学实验报告课程名称:学院:计算机与软件学院实验时间:实验报告提交时间:教务处制一、实验目标:1. 熟悉vi编辑器的使用2. 掌握简单的Shell编程2.1. 掌握Shell变量的使用2.2. 掌握Shell表达式的使用2.3. 掌握Shell流程控制语句的使用3. 熟悉Shell程序的执行和跟踪二、实验环境与工件湖边Linux实验室Fedora 13三、实验内容与步骤1. 下面哪个命令会实现将变量VAR1和VAR2相加,并且值存入变量VAR3的功能?( D )(5分)[ $VAR3 = $VAR1 + $VAR2 ]$VAR3 = [ $VAR1 + $VAR2 ]$VAR3 = (( VAR1 + VAR2 ))(( VAR3 = VAR1 + VAR2 ))2. 以下程序的输出是?(D )(5分)#!/usr/bin/shA=1while [ $A -lt 10 ]doB=1while [ $B -lt 10 ]dobreak 2echo "Inner loop"doneecho "Outer loop"doneA. “Inner loop” 将被打印10次B. “Outer loop” 将被打印10次.C. “Outer loop” 将被打印10次.D. 什么都没有被打印.3. 请在vi中逐一编辑,修正(如果有误)并执行以下10个shell脚本程序,然后结合所学知识和程序的输出理解各程序中各语句的含义,对各小题附上结果截图。
(每小题5分)3.1. 编写一个简单的回显用户名的shell程序。
#!/bin/bash#filename:dateecho "Mr.$USER,Today is:"echo 'date'echo Whish you a lucky day!3.2.使用if-then语句创建简单的shell程序。
linux下c程序的编写实验报告
linux下c程序的编写实验报告实验主题:在Linux下编写C程序的实验报告一、引言(150-200字)Linux是一种广泛应用的操作系统,具有高度开放性和灵活性,也是许多程序员首选的开发环境。
在Linux中,通过编写C程序可以实现各种应用和功能。
本实验旨在通过一步一步的说明和回答,介绍在Linux下编写C 程序的基本步骤和方法。
二、实验步骤(400-500字)1. 设置编程环境在Linux中编写C程序,首先需要安装相关的开发工具和编译器。
常用的编译器有gcc和clang,可以通过包管理器进行安装。
同时,也需要一个文本编辑器来编写C代码,比如vim或者emacs。
2. 编写Hello World程序Hello World程序是C语言学习的经典入门程序,它可以在屏幕上输出"Hello World"。
在文本编辑器中新建一个文件,命名为hello.c,然后在文件中输入以下代码:#include <stdio.h>int main() {printf("Hello World\n");return 0;}保存文件后,使用gcc编译器将该文件编译成可执行文件。
在终端中执行以下命令:gcc -o hello hello.c此时会生成一个名为hello的可执行文件。
通过执行该文件,可以在终端中看到输出结果"Hello World"。
3. 命令行参数和用户输入C程序可以接受命令行参数和用户输入,从而实现更复杂的功能。
在上一步编写的程序的基础上,我们尝试接收用户输入的姓名,并输出相应的问候语。
在hello.c文件中添加以下代码段:#include <stdio.h>int main(int argc, char *argv[]) {char name[100];printf("Please enter your name: ");scanf("s", name);printf("Hello, s!\n", name);return 0;}重新编译程序并执行,可以看到在终端中会提示用户输入姓名,并输出相应的问候语。
linux程序设计实验报告
linux程序设计实验报告《Linux程序设计实验报告》在计算机科学领域,Linux操作系统一直是一个备受关注的话题。
作为一个开源的操作系统,Linux拥有强大的稳定性和灵活性,因此在各种领域都得到了广泛的应用。
本次实验报告将介绍我在Linux程序设计实验中的一些经验和收获。
实验一:环境搭建在实验的第一部分,我们需要搭建Linux操作系统的开发环境。
我选择了Ubuntu作为我的开发平台,并安装了gcc编译器和其他必要的工具。
在这个过程中,我学会了如何在Linux系统中安装软件包,配置环境变量以及使用命令行工具进行开发。
实验二:基本程序设计在这一部分,我们需要编写一些简单的程序来熟悉Linux系统的编程环境。
我选择了C语言作为主要的开发语言,因为在Linux系统中C语言是最常用的编程语言之一。
通过编写一些简单的程序,我学会了如何在Linux系统中进行编译、链接和调试。
实验三:文件操作在Linux系统中,文件操作是一个非常重要的部分。
在这个实验中,我们需要编写一些程序来进行文件的读写操作。
我学会了如何使用系统调用来打开、读取和写入文件,以及如何处理文件操作中可能出现的错误。
实验四:进程管理Linux系统是一个多进程的操作系统,因此进程管理是一个非常重要的主题。
在这个实验中,我学会了如何创建新进程、进行进程间通信以及处理进程的状态变化。
通过编写一些简单的多进程程序,我加深了对Linux系统进程管理的理解。
总结通过这次实验,我对Linux系统的程序设计有了更深入的了解。
我学会了如何搭建开发环境、进行基本的程序设计、进行文件操作以及进行进程管理。
这些知识不仅对我未来的学习和工作有着重要的意义,也为我进一步深入学习Linux 系统打下了坚实的基础。
希望通过不断的实践和学习,我能够在Linux系统的程序设计领域有所建树。
Linux程序设计实验报告.doc
Linux程序设计实验报告Linux程序设计实验报告姓名学号班级指导教师2008年3月实验一Linux基本命令的使用1、实验内容和步骤步骤1以user_login用户身份并使用telnet登录Linux 服务器login (输入username)password (输入密码)步骤2使用新创建的用户账户和口令登录Linux系统,察看登录后的界面。
Adduser tty1 步骤3使用pwd命令,然后用ls命令,使用-a,-l,-F,-A,-lF等不同选项并比较不同之处。
[rootteacher ] pwd /root ls anaconda-ks.cfg Documents install.log.syslog Pictures Videos chapter15 Downloads kk Public Desktop install.log Music Templates ls -a 显示出包含隐藏文件的所有文件ls -F 显示出当前目录下的文件及其类型ls -l 显示目录下所有文件的许可权、拥有者、文件大小、修改时间及名称ls -R 显示出该目录及其子目录下的文件步骤4在当前目录下建立一个名为test的新目录,然后将工作目录切换到test下,尝试将/etc目录下的文件passwd拷贝到该目录下(cp 源文件目的目录)。
察看当前目录下的passwd文件的属主和文件权限。
Mkdir test cp /etc/passwd test ls -l total 4 -rw-r--r--. 1 root root 2755 2010-06-11 1315 passwd 步骤5尝试向当前目录下的passwd文件和/etc/passwd文件分别写入一些新内容,用cat命令浏览文件password的内容,用more命令进行浏览翻页操作,再用less命令浏览文件的内容。
可以cat passwd hello world cat passwd|more hello world cat passwd|lesshello world END 步骤6用ls命令查看test下文件的权限,用mv命令更改文件password的文件名为test.txt,尝试用chown和chgrp更改文件的属主为root、组为root,看看能否成功,不成功,请说明原因。
Linux程序设计结课报告
考查课程报告课程名称: Linux程序设计设计题目: Linux程序设计研究学院:信息工程与自动化学院专业:计算机科学与技术年级: 2010级学生姓名:指导教师:欧阳鑫日期: 2013年6月13日教务处目录目录 (1)摘要 (2)一、设计目的……….......……………………………………......................... .2二、设计内容 (2)三、开发运行平台或软件 (2)四、源代码或操作步骤 (2)五、运行结果(截图) (11)六、实验总结 (13)摘要Linux作为一种代码开源化和运行稳定,可靠性高、可移植性好的系统,以及它是一种“自由软件”:所谓自由,是指用户可以自由地获取程序及其源代码,并能自由地使用它们,包括修改或拷贝等特点。
并且作为自由软件中最为出色的一个,Linux具有如下的特点:它具有完全遵循POSLX标准,并扩展支持所有AT&T和BSD Unix特性的网络操作系统。
其所有核心代码都是由Linus Torvalds以及其他优秀的程序员们完成,所以Linu x不是Unix,但Linux与Unix完全兼容;它是真正的多任务、多用户系统,内置网络支持,能与NetWare、Windows NT、OS/2、Unix等无缝连接。
网络效能在各种Unix 测试评比中速度最快。
同时支持FAT32、NTFS、Ex t2FS、ISO9600等多种文件系统;它是可运行于多种硬件平台,包括Alpha、PowerPC、MIPS等处理器,对各种新型外围硬件,也可以从分布于全球的众多程序员那里得到迅速地支持;它对硬件要求较低,可在较低档的机器上获得很好的性能,特别值得一提的是Linux出色的稳定性,其运行时间往往可以“年”计;同时它有广泛的应用程序支持。
所以Linux操作系统在今天的计算机领域乃至以后的计算机领域都将起到很大的作用,有很大的发展前景。
一、设计目的(1)能够安装虚拟机,并在虚拟机上安装Red Hat Enterprise Linux 5;(2)熟悉在Red Hat Enterprise Linux 5环境,以及在Red Hat Enterprise Linux 5下进行shell程序、C程序、多线程的开发;(3)在熟悉Red Hat Enterprise Linux 5开发环境的前提下,掌握一些最常用的操作命令。
linux程序设计实验报告
linux程序设计实验报告Linux程序设计实验报告引言在计算机科学领域,操作系统是一项至关重要的基础设施。
Linux作为一种开源的操作系统,具有广泛的应用和开发者社区。
本次实验旨在通过Linux程序设计,深入了解Linux操作系统的内部机制和编程技巧。
一、实验背景与目的Linux操作系统以其稳定性、安全性和灵活性而闻名。
本次实验的目的是通过编写Linux程序,探索Linux操作系统的核心原理和实践技巧。
通过实践操作,我们可以更好地理解Linux内核、进程管理、文件系统和网络通信等方面的工作原理。
二、实验环境与工具本次实验使用的实验环境为Ubuntu操作系统,我们将使用C语言进行程序设计。
以下是本次实验所用到的工具和软件:1. Ubuntu 18.04 LTS操作系统2. GCC编译器3. GNU Make工具4. Vim文本编辑器三、实验内容与步骤1. 进程管理在Linux操作系统中,进程是程序的执行实例。
我们将通过编写一个简单的多进程程序来理解进程的创建、调度和终止。
首先,我们需要使用fork()系统调用创建一个新的子进程。
然后,通过exec()系统调用加载一个新的程序到子进程中。
最后,使用wait()系统调用等待子进程的结束并回收资源。
2. 文件系统Linux操作系统中的文件系统是一种层次化的存储结构。
我们将通过编写一个简单的文件读写程序来理解文件系统的基本操作。
首先,我们需要使用open()系统调用打开一个文件,并指定读写权限。
然后,使用read()和write()系统调用读取和写入文件的内容。
最后,使用close()系统调用关闭文件。
3. 网络通信Linux操作系统提供了丰富的网络通信功能。
我们将通过编写一个简单的网络通信程序来理解网络套接字的使用。
首先,我们需要使用socket()系统调用创建一个套接字,并指定通信协议。
然后,使用bind()系统调用将套接字绑定到指定的IP地址和端口号。
Linux程序设计课程设计报告
Linux程序设计课程设计报告2010-2011学年第二学期设计题目:基于GNOME的菜单构件学号:姓名:成绩评定:日期:目录一、设计任务书 (1)1.1 题目与要求 (1)1.2 本程序涉及的知识点 (1)二、关键技术、程序难点与解决方案 (2)三、功能设计 (3)3.1、程序算法 (3)3.2、主要功能流程图 (5)3.3、具体功能说明图 (5)四、程序设计主要代码 (6)五、Linux程序设计课设总结 (7)一、设计任务书1.1、题目与要求题目:编写一个能够包含菜单构件的GNOME程序要求:顶层菜单包含“文件”和“编辑”两项,其中在文件的子菜单中包含“新建”和“关于”,编辑的子菜单中包含“输入”和“输入”当我们单击文件菜单的子菜单“新建”时,在屏幕上输出“Good Luck !”;当单击“关于”时,在屏幕上输出“Linux C”;当我们单击“输入”时,从终端读入一个字符串(字符串的长可是由编程者自定);当单击“输出”时,从终端输出一我们刚刚读入的字符串,如果没有读入字符串,那么就提出“请先输入字符串:”之后输入字符串,再执行输出。
1.2、本程序涉及的知识点本程序涉及的知识点是首先要弄明白什么是GNOME,在GNOME中的程序设计中,需要知道菜单是如何定义、调用,之后根据对于GNOME的了解再将菜单创建出来,定义函数将菜单的功能实现。
当程序编写完成进行编译、连接时千万不能忘记连接GNOME类库。
GnomeApp构件是GNOME应用程序的基本构件,这个构件能够包含菜单、工具栏和数据的主要实现窗口。
我们可以利用gnome_app_new函数来创建一个新的构件,再调用gnome_app_create_menu或gnome_app_create_toolbar函数就能够实现菜单的功能。
此外,在gnome的程序设计中类库的应用也是非常重要的,libgnome和libgnomeui是任何GNOME编程中都要用到的两个主要库,用来独立于任何特定的GUI工具箱。
嵌入式Linux程序设计报告
用文字或框图描述
本组设计的主要特色
我组设计的MINIQQ在完成了实验要求的同时还具备以下特色:
如MINIQQ运用皮肤界面、软键盘输入界面、发送消息等等
1.
2.
3.
4.
本组设计的体系结构
设计的结构框图
本组设计中各个部件的设计与特色
我组设计的MINIQQ主要包含以下几个部件:
嵌入式Linux程序设计报告
组长:姓名(学号)
成员:姓名(学号)
专业:机械工程及自动化
二0一二年1月
设计名称
给自己设计的起个名字
完成时间
2011.12.29
验收时间
2011.12.29
本组成员情况
姓名
学号
承程序)
编写MiniQQ程序2
本组设计的功能描述(含所有实现的模块的功能)
本组光盘粘贴处
请将光盘装入纸袋中粘贴于此。
本组设计主要测试与性能分析结果
我组设计的MINIQQ经过测试具有以下功能:
课程设计总结(包括设计的总结和还需改进的内容)
每个组员都要写
课程设计总结—姓名
课程设计总结—姓名
教师评语
签名:
1.,
2.
3..
4.
下面介绍各部件的设计思路及特色
本组设计的软件程序模块说明与使用手册
我组设计的MINIQQ具备以下几个模块:
1.模块
2.模块
3.模块
4.模块
5.模块
各模块功能描述:
各模块的设计思路:
各模块使用手册:
本组设计中的关键模块流程图及程序实现说明
介绍MINIQQ中关键模块的流程图及程序实现:
系统软件程序设计报告(linux下C语言程序课程设计报告)
一、 引言(简要说明设计题目的目的、意义、内容、主要任务等) 1.1 设计目的
本次系统软件课程设计的主要目的有两个:一方面是分析设计 linux 源代码,另一方面 是进行系统级的程序设计。 1.2 题目与要求
我计划编写的题目是:⑴小学算术运算测试程序。制作一个可供小学数学运算的程序: 10 以内加减法,能根据输入题数出题,判断题是否正确,最后计算分数。并用 make 工程管 理器编译,编写 makefile 文件。⑵简单聊天程序。在 linux 下用 C 语言编写一个简单的网络 聊天程序。实现网络传输功能。 1.3 内容及主要任务
2
⑴出题模块(question_out()):这一模块主要负责对题目的储存和调出这两个功能。 ⑵答题模块(answer()):这一模块主要负责将用户端的答案通过键盘输入到系统。 ⑶检查计分模块(check()):这一模块主要负责检查判断用户所提供的答案是否正确并 根据它来记录每题所的总分。 ⑷评分模块(count()):这一模块主要负责统计总得分并打印。 ⑸评价模块(assessment()) :这一模块主要负责根据给出的总得分打印相应的评语。 总之这五个模块都有着各自的功能且互相联系,五者在程序中缺一不可。 2.1.4 makefile 介绍 ⑴Makefile 文件介绍 Makefile 一个工程中的源文件不计数,其按类型、功能、模块分别放在若干个目录中, makefile 定义了一系列的规则来指定,哪些文件需要先编译,哪些文件需要后编译,哪些 文件需要重新编译,甚至于进行更复杂的功能操作,因为 makefile 就像一个 Shell 脚本一 样,其中也可以执行操作系统的命令。 ⑵makefile 主要功能 Make 工具最主要也是最基本的功能就是通过 makefile 文件来描述源程序之间的相互关 系并自动维护编译工作。而 makefile 文件需要按照某种语法进行编写,文件中需要说明如 何编译各个源文件并连接生成可执行文件,并要求定义源文件之间的依赖关系。makefile 文 件是许多编译器--包括 Windows NT 下的编译器--维护编译信息的常用方法,只是在集成开 发环境中,用户通过友好的界面修改 makefile 文件而已。 ⑶自动化编译 Makefile 带来的好处就是——“自动化编译”,一旦写好,只需要一个 make 命令,整 个工程完全自动编译,极大的提高了软件开发的效率。make 是一个命令工具,是一个解释 makefile 中指令的命令工具,一般来说,大多数的 IDE 都有这个命令,比如:Delphi 的 make, Visual C++的 nmake,Linux 下 GNU 的 make。可见,makefile 都成为了一种在工程方面的编 译方法。 2.1.5 makefile 规则
-Linux程序设计实验报告
实验报告课程名称:Linux程序设计学院:信息科学与工程学院专业:13计算机班级:2013-1 姓名:学号:2016年 6 月28 日山东科技大学教务处制实验报告1.登录和退出Linux系统用户登录系统时为了使系统能够识别自己必须输入用户名和密码经系统验证无后方能进入系统。
用户登录分两步进行,第一步输入用户的登录名,系统根据该登录名来识别用户,第二步输入用户的口令,该口令是用户自己选择的一个字符串对其他用户是保密的,是在登录时系统用来辨别真假用户的关键字。
必须输入用户的账号,分为1)root——系统管理员账号,该账号可以进行任意操作。
2)普通用户——拥有一定的权限2.其他命令三、实验容常用操作命令。
1、在Linux系统中打开终端,利用快捷键ctrl+alt+T,打开,结果如下:2、退出:实验报告echo `date`echo Wish you a lucky day!#chmod +x dat#./dat2. 使用if-then语句创建简单的shell程序#vi bbbb#!/bin/bash#filename:bbbbecho -n "Do you want to continue: Y or N" read ANSWERif [ $ANSWER = N -o $ANSWER = n ] thenecho "your answer is quit! "fi#chmod +x bbbb#./bbbb3. 使用if-then-else语句创建一个根据输入的分数判断是否及格的shell程序#vi ak#!/bin/bash#filename:akecho -n "please input a score:"read SCOREecho "You input Score is $SCORE"if [ $SCORE -ge 60 ];thenecho -n "Congratulation!You Pass the examination."elseecho -n "Sorry!You Fail the examination!"fiecho -n "press any key to continue!"read $GOOUT#chmod +x ak4. 使用for语句创建简单的shell程序#vi mm#!/bin/bash#filename:mmfor ab in 1 2 3 4doecho $abdone#chmod +x mm#./mm5. 使用while语句创建一个计算1-5的平方的shell程序#!/bin/bash#filename:zxint=1while [ $int -le 5 ]dosq=`expr $int \* $int`echo $sqint=`expr $int + 1`doneecho "Job completed"#chmod +x zx#./zx四、实验体会通过这次实验,我懂得了定义SHELL程序设计中的变量,掌握了SHELL程序中实验报告四、实验容1.浏览文件系统(1)运行pwd命令,确定你当前的工作目录。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
Linux程序设计课程设计 Linux程序设计课程组长春工业大学2017-12-24课程设计任务书目录第1章设计要求 (1)2.1设计目的 (1)2.2设计要求 (1)第2章测试数据设计 (2)第3章算法实现 (3)第4章算法结果 (19)第5章结果可视化 (21)第6章性能分析 (21)参考文献 (22)心得 (22)第1章设计要求2.1设计目的理解临界区和进程互斥的概念,掌握用信号量和PV操作实现进程互斥的方法。
2.2设计要求在linux环境下编写应用程序,该程序运行时能创建N个线程,其中既有读者线程又有写者线程,它们按照事先设计好的测试数据进行读写操作。
读者/写者问题描述如下:有一个被许多进程共享的数据区,这个数据区可以是一个文件,或者主存的一块空间,甚至可以是一组处理器寄存器。
有一些只读取这个数据区的线程(reader)和一些只往数据区中写数据的线程(writer)。
以下假设共享数据区是文件。
这些读者和写者对数据区的操作必须满足以下条件:读—读允许;读—写互斥;写—写互斥。
这些条件具体来说就是:(1)任意多的读线程可以同时读这个文件;(2)一次只允许一个写线程往文件中写;(3)如果一个写线程正在往文件中写,禁止任何读线程或写线程访问文件;(4)写线程执行写操作前,应让已有的写者或读者全部退出。
这说明当有读者在读文件时不允许写者写文件。
对于读者-写者问题,有三种解决方法:1、读者优先除了上述四个规则外,还增加读者优先的规定,当有读者在读文件时,对随后到达的读者和写者,要首先满足读者,阻塞写者。
这说明只要有一个读者活跃,那么随后而来的读者都将被允许访问文件,从而导致写者长时间等待,甚至有可能出现写者被饿死的情况。
2、写者优先除了上述四个规则外,还增加写者优先的规定,即当有读者和写者同时等待时,首先满足写者。
当一个写者声明想写文件时,不允许新的读者再访问文件。
3、无优先除了上述四个规则外,不再规定读写的优先权,谁先等待谁就先使用文件。
第2章 测试数据设计为了验证算法的正确性,需要设计测试数据,并对测试数据进行分析,总结出在该组测试数据下,程序应该得到什么结果,然后运行程序,将程序运行结果与分析结果相比较,如果二者一致,则可认为程序是正确的。
作者设计的测试数据如表1所示,包括10个线程,其中有5个读者线程r1~r5,另外5个是写者线程w1~w5。
读者线程r1在时刻0提出读请求,如果请求得到允许,r1将用15秒的时间读文件;写者线程w3在时刻6提出写请求,如果请求得到允许,w3将用10秒的时间写文件。
从表中可以看出,10个线程提出请求的次序是:r1,r2,w1,r3,w2,w3,r4,r5,w4,w5。
(1)读者优先算法线程实际读写文件顺序为:r1,r2,r3,r4,r5,w1,w2,w3,w4,w5。
执行情况见表2。
(2)写者优先算法线程实际读写文件顺序为:r1,r2,w1,w2,w3,w4,w5,r3,r4,r5。
执行情况见表3。
名称时刻时间作时刻作时刻"r1" 0 15 0 15"r2" 1 15 1 16"w1" 3 3 16 19"w2" 5 6 19 25"w3" 6 10 25 35"w4" 10 18 35 53"w5" 12 2 53 55"r3" 4 2 55 57"r4" 7 8 55 63"r5" 9 2 55 57(3)无优先算法线程实际读写文件顺序为:r1,r2,w1,r3,w2,w3,r4,r5,w4,w5。
执行情况见表4。
第3章算法实现读者优先算法:#include <time.h>#include <stdio.h>#include <unistd.h>#include <stdlib.h>#include <pthread.h>#include <string.h>#include <fcntl.h>#define MAX_THREAD 10#define SNL 8typedef struct{char tn[3]; //name of threadunsigned int rm; //the moment when this thread request to access data.unsigned int pt; //duration of operationunsigned int i; //same to rmunsigned int b; //instance at which this thread begin to operate data unsigned int e; //ending instance}TEST_INFO;//TEST_INFO test_data[MAX_THREAD];typedef struct {char sn[SNL+1]; //student numberTEST_INFO ti[MAX_THREAD]; //test item}TI; //test_item_for_student//TI test_items[STUDENTS];TI test_item={{"20152566"},{{"w1", 4,7},{"r1",11,14},{"r2",1,5},{"w2",8,11},{"w3",15,2},{"r3",5,8}, {"r4",12,15},{"w4",5,2},{"r5",9,12},{"r6",15,3}}};char r_seq[MAX_THREAD][3];char o_seq[MAX_THREAD][3];int sr=0;int so=0;int rc=0; //count how many readers are readingpthread_mutex_t cs_d; //guarentee mutually access datapthread_mutex_t cs_rc; //guarentee mutually access "rc"pthread_mutex_t cs_sr; //guarentee mutually access "sr"pthread_mutex_t cs_so; //guarentee mutually access "sr"time_t base; //the moment when function main begin/*void print_answer(){int i;printf("%s\n",test_item.sn);printf("name r_m p_t i_t b_t e_t\n");for(i=0;i<MAX_THREAD;i++){printf("%4s%4d%4d%8d%8d%8d\n",(test_item.ti)[i].tn,(test_item.ti)[i].rm,(test _item).ti[i].pt,(test_item.ti)[i].i,(test_item.ti)[i].b,(test_item.ti)[i].e);}printf("r_seq:");for(i=0;i<MAX_THREAD;i++){printf("%4s",r_seq[i]);}printf("\n");printf("o_seq:");for(i=0;i<MAX_THREAD;i++){printf("%4s",o_seq[i]);}printf("\n");}*/void save_answer(FILE *f){int i;fprintf(f,"\t%s_answer.txt\n\tr/w problem:read first\n\n",test_item.sn);fprintf(f,"name r_m p_t i_t b_t e_t\n");for(i=0;i<MAX_THREAD;i++){fprintf(f,"%4s%4d%4d%8d%8d%8d\n",(test_item.ti)[i].tn,(test_item.ti)[i].rm,(t est_item).ti[i].pt,(test_item.ti)[i].i,(test_item.ti)[i].b,(test_item.ti)[i].e);}fprintf(f,"\n");fprintf(f,"r_seq:");for(i=0;i<MAX_THREAD;i++){fprintf(f,"%4s",r_seq[i]);}fprintf(f,"\n");fprintf(f,"o_seq:");for(i=0;i<MAX_THREAD;i++){fprintf(f,"%4s",o_seq[i]);}fprintf(f,"\n");}void *r(void *td){struct timeval t;time_t rl=base;sleep(((TEST_INFO *)td)->rm); gettimeofday(&t,NULL);((TEST_INFO *)td)->i=difftime(_sec,rl); pthread_mutex_lock(&cs_sr);strcpy(r_seq[sr++],((TEST_INFO *)td)->tn); pthread_mutex_unlock(&cs_sr);pthread_mutex_lock(&cs_rc);rc++;if(rc==1)pthread_mutex_lock(&cs_d); pthread_mutex_unlock(&cs_rc);gettimeofday(&t,NULL);((TEST_INFO *)td)->b=difftime(_sec,rl); pthread_mutex_lock(&cs_so);strcpy(o_seq[so++],((TEST_INFO *)td)->tn); pthread_mutex_unlock(&cs_so);sleep(((TEST_INFO *)td)->pt); gettimeofday(&t,NULL);((TEST_INFO *)td)->e=difftime(_sec,rl);pthread_mutex_lock(&cs_rc);rc--;if(rc==0)pthread_mutex_unlock(&cs_d); pthread_mutex_unlock(&cs_rc);return 0;}void *w(void *td){struct timeval t;time_t wl=base;sleep(((TEST_INFO *)td)->rm); gettimeofday(&t,NULL);((TEST_INFO *)td)->i=difftime(_sec,wl); pthread_mutex_lock(&cs_sr);strcpy(r_seq[sr++],((TEST_INFO *)td)->tn); pthread_mutex_unlock(&cs_sr);pthread_mutex_lock(&cs_d); gettimeofday(&t,NULL);((TEST_INFO *)td)->b=difftime(_sec,wl); pthread_mutex_lock(&cs_so);strcpy(o_seq[so++],((TEST_INFO *)td)->tn); pthread_mutex_unlock(&cs_so);sleep(((TEST_INFO *)td)->pt); gettimeofday(&t,NULL);((TEST_INFO *)td)->e=difftime(_sec,wl);pthread_mutex_unlock(&cs_d);return 0;}void create_exam(){int i=0;pthread_t ht[MAX_THREAD];pthread_mutex_init(&cs_d,NULL);pthread_mutex_init(&cs_rc,NULL);pthread_mutex_init(&cs_sr,NULL);pthread_mutex_init(&cs_so,NULL);struct timeval t;gettimeofday(&t,NULL);base=_sec;for(i=0;i<MAX_THREAD;i++){if((test_item.ti)[i].tn[0]=='r'){pthread_create(&ht[i],NULL,r,&((test_item.ti)[i]));}else if((test_item.ti)[i].tn[0]=='w'){pthread_create(&ht[i],NULL,w,&((test_item.ti)[i]));}}for(i=0;i<MAX_THREAD;i++){pthread_join(ht[i],NULL);}pthread_mutex_destroy(&cs_d);pthread_mutex_destroy(&cs_rc);pthread_mutex_destroy(&cs_sr);pthread_mutex_destroy(&cs_so);}int main(int argc,char *argv[]){int i=0;int si,pos;int fd;FILE *fa;char file_name[100];create_exam();sprintf(file_name,"%s_answer.txt",test_item.sn);if((fa=fopen(file_name,"w"))==NULL){printf("Error openning answer file:%s\n",file_name);exit(3);}save_answer(fa);exit(0);}1.写优先算法#include <time.h>#include <stdio.h>#include <unistd.h>#include <stdlib.h>#include <pthread.h>#include <string.h>#include <fcntl.h>#define MAX_THREAD 10#define SNL 8typedef struct{char tn[3]; //name of threadunsigned int rm; //the moment when this thread request to access data.unsigned int pt; //duration of operationunsigned int i; //same to rmunsigned int b; //instance at which this thread begin to operate dataunsigned int e; //ending instance}TEST_INFO;//TEST_INFO test_data[MAX_THREAD];typedef struct {char sn[100]; //student numberTEST_INFO ti[MAX_THREAD]; //test item}TI; //test_item_for_student//TI test_items[STUDENTS];TI test_item={{"20152566"},{{"w1", 4,7},{"r1",11,14},{"r2",1,5},{"w2",8,11},{"w3",15,2},{"r3",5,8}, {"r4",12,15},{"w4",5,2},{"r5",9,12},{"r6",15,3}}};char r_seq[MAX_THREAD][3];char o_seq[MAX_THREAD][3];int sr=0;int so=0;int rc=0; //count how many readers are readingpthread_mutex_t cs_d; //guarentee mutually access datapthread_mutex_t cs_rc; //guarentee mutually access "rc"pthread_mutex_t cs_sr; //guarentee mutually access "sr"pthread_mutex_t cs_so; //guarentee mutually access "sr"time_t base; //the moment when function main begin/*void print_answer(){int i;printf("%s\n",test_item.sn);printf("name r_m p_t i_t b_t e_t\n");for(i=0;i<MAX_THREAD;i++){printf("%4s%4d%4d%8d%8d%8d\n",(test_item.ti)[i].tn,(test_item.ti)[i].rm,(test _item).ti[i].pt,(test_item.ti)[i].i,(test_item.ti)[i].b,(test_item.ti)[i].e);}printf("r_seq:");for(i=0;i<MAX_THREAD;i++){printf("%4s",r_seq[i]);}printf("\n");printf("o_seq:");for(i=0;i<MAX_THREAD;i++){printf("%4s",o_seq[i]);}printf("\n");}*/void save_answer(FILE *f){ //save the resultint i;fprintf(f,"\t%s_answer.txt\n\tr/w problem:read first\n\n",test_item.sn);fprintf(f,"name r_m p_t i_t b_t e_t\n");for(i=0;i<MAX_THREAD;i++){fprintf(f,"%4s%4d%4d%8d%8d%8d\n",(test_item.ti)[i].tn,(test_item.ti)[i].rm,(t est_item).ti[i].pt,(test_item.ti)[i].i,(test_item.ti)[i].b,(test_item.ti)[i].e);}fprintf(f,"\n");fprintf(f,"r_seq:");for(i=0;i<MAX_THREAD;i++){fprintf(f,"%4s",r_seq[i]);}fprintf(f,"\n");fprintf(f,"o_seq:");for(i=0;i<MAX_THREAD;i++){fprintf(f,"%4s",o_seq[i]);}fprintf(f,"\n");}void *w(void *td){struct timeval t;//结构体精确到秒time_t rl=base; //返回时间main函数开始的时间sleep(((TEST_INFO *)td)->rm);//休眠读线程进入的时间长gettimeofday(&t,NULL);//获得当前的时间((TEST_INFO *)td)->i=difftime(_sec,rl);//将系统时间与main主函数执行的时间差赋值给i变量(读线程进入的时间)pthread_mutex_lock(&cs_sr);//建立互斥锁strcpy(r_seq[sr++],((TEST_INFO *)td)->tn);pthread_mutex_unlock(&cs_sr);//解除互斥锁pthread_mutex_lock(&cs_rc);rc++;if(rc==1)pthread_mutex_lock(&cs_d);pthread_mutex_unlock(&cs_rc);gettimeofday(&t,NULL);//获得当前的时间((TEST_INFO *)td)->b=difftime(_sec,rl);//将系统时间与main主函数执行的时间差赋值给b变量(读线程开始的时间)pthread_mutex_lock(&cs_so);strcpy(o_seq[so++],((TEST_INFO *)td)->tn);//将读线程名复制给0_seq队列pthread_mutex_unlock(&cs_so);sleep(((TEST_INFO *)td)->pt);//休眠写进程持续的时间长gettimeofday(&t,NULL);//获得当前的时间((TEST_INFO *)td)->e=difftime(_sec,rl);//pthread_mutex_lock(&cs_rc);rc--;if(rc==0)pthread_mutex_unlock(&cs_d);pthread_mutex_unlock(&cs_rc);return 0;}void *r(void *td){struct timeval t;time_t wl=base;sleep(((TEST_INFO *)td)->rm);//休眠写进程进入的时间长gettimeofday(&t,NULL);((TEST_INFO *)td)->i=difftime(_sec,wl);//将系统时间与main主函数执行的时间差赋值给i变量(写线程进入的时间)pthread_mutex_lock(&cs_sr);//建立互斥锁strcpy(r_seq[sr++],((TEST_INFO *)td)->tn);// 将写线程名复制给r_seq队列pthread_mutex_unlock(&cs_sr);//解除互斥锁pthread_mutex_lock(&cs_d);gettimeofday(&t,NULL);//获得当前的时间((TEST_INFO *)td)->b=difftime(_sec,wl);//将系统时间与main主函数执行的时间差赋值给b变量(写线程开始的时间)pthread_mutex_lock(&cs_so);strcpy(o_seq[so++],((TEST_INFO *)td)->tn);// 将写线程名复制给o_seq队列pthread_mutex_unlock(&cs_so);sleep(((TEST_INFO *)td)->pt);//休眠写进程持续的时间长gettimeofday(&t,NULL);//获取当前的时间((TEST_INFO *)td)->e=difftime(_sec,wl);//将系统时间与main主函数执行的时间差赋值给e变量(写线程结束的时间)pthread_mutex_unlock(&cs_d);return 0;}void create_exam(){int i=0;pthread_t ht[MAX_THREAD];pthread_mutex_init(&cs_d,NULL);//初始化互斥锁pthread_mutex_init(&cs_rc,NULL);pthread_mutex_init(&cs_sr,NULL);pthread_mutex_init(&cs_so,NULL);struct timeval t;gettimeofday(&t,NULL);base=_sec;for(i=0;i<MAX_THREAD;i++){//分别创建读写线程的初始化if((test_item.ti)[i].tn[0]=='r'){pthread_create(&ht[i],NULL,r,&((test_item.ti)[i]));}else if((test_item.ti)[i].tn[0]=='w'){pthread_create(&ht[i],NULL,w,&((test_item.ti)[i]));}}for(i=0;i<MAX_THREAD;i++){pthread_join(ht[i],NULL);}pthread_mutex_destroy(&cs_d);//销毁互斥锁pthread_mutex_destroy(&cs_rc);pthread_mutex_destroy(&cs_sr);pthread_mutex_destroy(&cs_so);}int main(int argc,char *argv[]){int i=0;int si,pos;int fd;FILE *fa;char file_name[100];create_exam();sprintf(file_name,"%s_answer.txt",test_item.sn);//从文件中读取if((fa=fopen(file_name,"w"))==NULL){printf("Error openning answer file:%s\n",file_name);exit(3);}save_answer(fa);exit(0);}2.无优先算法#include <time.h>#include <stdio.h>#include <unistd.h>#include <stdlib.h>#include <pthread.h>#include <string.h>#include <fcntl.h>#define MAX_THREAD 10#define SNL 8typedef struct{char tn[3]; //name of threadunsigned int rm; //the moment when this thread request to access data.unsigned int pt; //duration of operationunsigned int i; //same to rmunsigned int b; //instance at which this thread begin to operate dataunsigned int e; //ending instance}TEST_INFO;//TEST_INFO test_data[MAX_THREAD];typedef struct {char sn[100]; //student numberTEST_INFO ti[MAX_THREAD]; //test item}TI; //test_item_for_student//TI test_items[STUDENTS];TI test_item={{"20152566"},{{"w1", 4,7},{"r1",11,14},{"r2",1,5},{"w2",8,11},{"w3",15,2},{"r3",5,8},{"r4",12,15},{"w4",5,2},{"r5",9,12},{"r6",15,3}}};char r_seq[MAX_THREAD][3];char o_seq[MAX_THREAD][3];int sr=0;int so=0;int rc=0; //count how many readers are readingpthread_mutex_t cs_d; //guarentee mutually access datapthread_mutex_t cs_rc; //guarentee mutually access "rc"pthread_mutex_t cs_sr; //guarentee mutually access "sr"pthread_mutex_t cs_so; //guarentee mutually access "sr"time_t base; //the moment when function main begin/*void print_answer(){int i;printf("%s\n",test_item.sn);printf("name r_m p_t i_t b_t e_t\n");for(i=0;i<MAX_THREAD;i++){printf("%4s%4d%4d%8d%8d%8d\n",(test_item.ti)[i].tn,(test_item.ti)[i].rm,(test _item).ti[i].pt,(test_item.ti)[i].i,(test_item.ti)[i].b,(test_item.ti)[i].e);}printf("r_seq:");for(i=0;i<MAX_THREAD;i++){printf("%4s",r_seq[i]);}printf("\n");printf("o_seq:");for(i=0;i<MAX_THREAD;i++){printf("%4s",o_seq[i]);}printf("\n");}*/void save_answer(FILE *f){ //save the resultint i;fprintf(f,"\t%s_answer.txt\n\tr/w problem:read first\n\n",test_item.sn);fprintf(f,"name r_m p_t i_t b_t e_t\n");for(i=0;i<MAX_THREAD;i++){fprintf(f,"%4s%4d%4d%8d%8d%8d\n",(test_item.ti)[i].tn,(test_item.ti)[i].rm,(t est_item).ti[i].pt,(test_item.ti)[i].i,(test_item.ti)[i].b,(test_item.ti)[i].e);}fprintf(f,"\n");fprintf(f,"r_seq:");for(i=0;i<MAX_THREAD;i++){fprintf(f,"%4s",r_seq[i]);}fprintf(f,"\n");fprintf(f,"o_seq:");for(i=0;i<MAX_THREAD;i++){fprintf(f,"%4s",o_seq[i]);}fprintf(f,"\n");}void *r(void *td){struct timeval t;//结构体精确到秒time_t rl=base; //返回时间main函数开始的时间sleep(((TEST_INFO *)td)->rm);//休眠读线程进入的时间长gettimeofday(&t,NULL);//获得当前的时间((TEST_INFO *)td)->i=difftime(_sec,rl);//将系统时间与main主函数执行的时间差赋值给i变量(读线程进入的时间)pthread_mutex_lock(&cs_sr);//建立互斥锁strcpy(r_seq[sr++],((TEST_INFO *)td)->tn);pthread_mutex_unlock(&cs_sr);//解除互斥锁pthread_mutex_lock(&cs_rc);rc++;if(rc==1)pthread_mutex_lock(&cs_d);pthread_mutex_unlock(&cs_rc);gettimeofday(&t,NULL);//获得当前的时间((TEST_INFO *)td)->b=difftime(_sec,rl);//将系统时间与main主函数执行的时间差赋值给b变量(读线程开始的时间)pthread_mutex_lock(&cs_so);strcpy(o_seq[so++],((TEST_INFO *)td)->tn);//将读线程名复制给0_seq队列pthread_mutex_unlock(&cs_so);sleep(((TEST_INFO *)td)->pt);//休眠写进程持续的时间长gettimeofday(&t,NULL);//获得当前的时间((TEST_INFO *)td)->e=difftime(_sec,rl);//pthread_mutex_lock(&cs_rc);rc--;if(rc==0)pthread_mutex_unlock(&cs_d);pthread_mutex_unlock(&cs_rc);return 0;}void *w(void *td){struct timeval t;time_t wl=base;sleep(((TEST_INFO *)td)->rm);//休眠写进程进入的时间长gettimeofday(&t,NULL);((TEST_INFO *)td)->i=difftime(_sec,wl);//将系统时间与main主函数执行的时间差赋值给i变量(写线程进入的时间)pthread_mutex_lock(&cs_sr);//建立互斥锁strcpy(r_seq[sr++],((TEST_INFO *)td)->tn);// 将写线程名复制给r_seq队列pthread_mutex_unlock(&cs_sr);//解除互斥锁pthread_mutex_lock(&cs_d);gettimeofday(&t,NULL);//获得当前的时间((TEST_INFO *)td)->b=difftime(_sec,wl);//将系统时间与main主函数执行的时间差赋值给b变量(写线程开始的时间)pthread_mutex_lock(&cs_so);strcpy(o_seq[so++],((TEST_INFO *)td)->tn);// 将写线程名复制给o_seq队列pthread_mutex_unlock(&cs_so);sleep(((TEST_INFO *)td)->pt);//休眠写进程持续的时间长gettimeofday(&t,NULL);//获取当前的时间((TEST_INFO *)td)->e=difftime(_sec,wl);//将系统时间与main主函数执行的时间差赋值给e变量(写线程结束的时间)pthread_mutex_unlock(&cs_d);return 0;}void create_exam(){int i=0;pthread_t ht[MAX_THREAD];pthread_mutex_init(&cs_d,NULL);//初始化互斥锁pthread_mutex_init(&cs_rc,NULL);pthread_mutex_init(&cs_sr,NULL);pthread_mutex_init(&cs_so,NULL);struct timeval t;gettimeofday(&t,NULL);base=_sec;for(i=0;i<MAX_THREAD;i++){//分别创建读写线程的初始化pthread_create(&ht[i],NULL,r,&((test_item.ti)[i]));}for(i=0;i<MAX_THREAD;i++){pthread_join(ht[i],NULL);}pthread_mutex_destroy(&cs_d);//销毁互斥锁pthread_mutex_destroy(&cs_rc);pthread_mutex_destroy(&cs_sr);pthread_mutex_destroy(&cs_so);}int main(int argc,char *argv[]){int i=0;int si,pos;int fd;FILE *fa;char file_name[100];create_exam();sprintf(file_name,"%s_answer.txt",test_item.sn);//从文件中读取if((fa=fopen(file_name,"w"))==NULL){printf("Error openning answer file:%s\n",file_name);exit(3);}save_answer(fa);exit(0);}第4章算法结果读者优先写者无优先第5章结果可视化第6章性能分析1.读优先等待时间=b_t-i_t=99平均等待时间=9.9周转时间=e_t-i_t=170平均周转时间=17带权周转时间=周转时间/p_t=15.15带权平均周转时间=1.5152.写优先等待时间=b_t-i_t=127平均等待时间=12.7周转时间=e_t-i_t=208平均周转时间=20.8带权周转时间=周转时间/p_t=带权平均周转时间=2.423.无优先\等待时间=b_t-i_t=41+4+18+0+20+9+30+2+13=周转时间=e_t-i_t=56+10+31+3+20+16+43+6+20=带权周转时间=周转时间/p_t=56/15+13/6+40/13+3/3+27/0+20/7+53/13+7/4+27/10=参考文献GNU/Linux编程心得这次的实验课程设计可以说的上是正规的解决问题的案例了。