Linux程序设计报告

合集下载

浙江大学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程序设计》实验指导书实验类别:课实验实验课程名称: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编程实验报告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操作系统相关的知识
和编程技巧。

本次实验囊括了Linux操作系统中常用的一些工具和命令,如gcc编译器、make工具、shell脚本等,在深入学习这些工具的同时,我也能更加熟练地运用Linux系
统进行编程。

在实验中,我学习了很多关于编译工具的知识。

gcc是Linux中常用的编译器,它支
持多种语言的编译。

make工具则可以帮助我们更加简单地进行代码构建和管理。

在实验中,我通过这些工具,可以更加高效地进行程序开发。

同时,我也学到了如何创建和调用自己的shell脚本。

shell脚本可以帮助我们更加
快速地进行一些特定的操作命令,如在系统启动时自动运行程序等等。

在编写shell脚本
的过程中,我学到了很多常用的命令,如if语句、while语句、echo命令等等,这些知识可以帮助我更加方便地进行Linux系统管理。

最后,我觉得本次实验让我更加深入地了解了Linux操作系统和编程方面的知识,同
时也锻炼了我的编程能力和实践操作能力。

在以后的学习和工作中,我会更加注意Linux
系统的应用和开发,为自己的职业发展打下坚实的基础。

Linux程序设计实验报告总结计划.docx

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程序设计实验报告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程序的编写实验报告实验主题:在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程序设计实验中的一些经验和收获。

实验一:环境搭建在实验的第一部分,我们需要搭建Linux操作系统的开发环境。

我选择了Ubuntu作为我的开发平台,并安装了gcc编译器和其他必要的工具。

在这个过程中,我学会了如何在Linux系统中安装软件包,配置环境变量以及使用命令行工具进行开发。

实验二:基本程序设计在这一部分,我们需要编写一些简单的程序来熟悉Linux系统的编程环境。

我选择了C语言作为主要的开发语言,因为在Linux系统中C语言是最常用的编程语言之一。

通过编写一些简单的程序,我学会了如何在Linux系统中进行编译、链接和调试。

实验三:文件操作在Linux系统中,文件操作是一个非常重要的部分。

在这个实验中,我们需要编写一些程序来进行文件的读写操作。

我学会了如何使用系统调用来打开、读取和写入文件,以及如何处理文件操作中可能出现的错误。

实验四:进程管理Linux系统是一个多进程的操作系统,因此进程管理是一个非常重要的主题。

在这个实验中,我学会了如何创建新进程、进行进程间通信以及处理进程的状态变化。

通过编写一些简单的多进程程序,我加深了对Linux系统进程管理的理解。

总结通过这次实验,我对Linux系统的程序设计有了更深入的了解。

我学会了如何搭建开发环境、进行基本的程序设计、进行文件操作以及进行进程管理。

这些知识不仅对我未来的学习和工作有着重要的意义,也为我进一步深入学习Linux 系统打下了坚实的基础。

希望通过不断的实践和学习,我能够在Linux系统的程序设计领域有所建树。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 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编程心得这次的实验课程设计可以说的上是正规的解决问题的案例了。

相关文档
最新文档