linux程序设计实验报告大作业.pdf
实 验 报 告课程名称:LINUX 程序设计学院:计算机学院专 业:软件工程班 级:14-3姓 名:张正锟学 号:10382017 年 1 月 1 日山 东 科 技 大 学 教 务 处 制实 验 报 告组别实验项目名称教师评语实验成绩姓名张正锟同组实验者实验日期第 11 周周四9,10 节实验一 熟悉 Linux 命令指导教师一、一、实验目的实验目的熟悉并掌握 Linux 操作系统基本命令二、二、常用的普通命令常用的普通命令1.1.了解系统的了解系统的 uname,date,wuname,date,w 命令命令2.2.了解文件的了解文件的 lsls 和和 filefile 命令命令3.3.cat,less,head,tail,nl,wccat,less,head,tail,nl,wc 等命令的使用等命令的使用4.4.文本内容查找文本内容查找 grepgrep 命令命令5.5.文件权限的修改文件权限的修改 chmod,chown,umaskchmod,chown,umask6.6.文件夹操作:文件夹操作:mkdir,rmdirmkdir,rmdir三、三、用户和组的管理管理用户和组的管理管理1.1.探究用户配置文件探究用户配置文件/etc/passwd,/etc/shadow/etc/passwd,/etc/shadow/etc/passwd 是用户数据库,其中的域给出了用户名、加密口令和用户的其他信息./etc/shadow 是在安装了影子(shadow)口令软件的系统上的影子口令文件。影子口令文件将/etc/passwd 文件中的加密口令移动到/etc/shadow 中,而后者只对超级用户(r o o t)可读。这使破译口令更困难,以此增加系统的安全性。2.2.探究组配置文件组的配置文件探究组配置文件组的配置文件/etc/group,/etc/gshadow/etc/group,/etc/gshadow3.3.id,who,whoami,groupsid,who,whoami,groups 等命令等命令四、四、文件打包与压缩文件打包与压缩1.1.tartar 压缩和解压压缩和解压五、五、软件包管理软件包管理1.1.安装软件安装软件 treetree2.2.卸载软件卸载软件 treetree六、六、进程管理进程管理1.1.toptop 命令动态显示进程状态命令动态显示进程状态2.2.psps 命令显示瞬时进程状态命令显示瞬时进程状态3.3.KillKill 命令终止一个进程命令终止一个进程用 gedit 打开一个文件并在后台运行,显示的进程号为17271,然后用kill 命令杀死这个进程,观察到 gedit 关闭七、七、实验总结实验总结通过本次实验,熟悉了好多 Linux 下面的基本命令,可以看出 Linux 的命令基本上都有好多参数可选,这样就可以用一条命令完成好多任务,大大提高效率。另外还学会了当命令不会使用的时候,可以调用 man 来查看命令的使用方法。实 验 报 告组别实验项目名称教师评语实验成绩姓名张正锟同组实验者实验日期第 12 周周四9,10 节实验二 Shell 编程指导教师一、一、实实验目的验目的掌握 Shell 命行的运行掌握编写和执行 Shell 程序的步骤掌握在 Shell 中使用参数和使用变量的方法掌握表达式比较,循环结构语句和条件结构语句的写法掌握在 shell 脚本中使用函数的方法二、二、简简单单 bashbash 脚本脚本1.1.编写编写 bashbash 脚本脚本2.2.添加执行权限添加执行权限3.3.运行结果运行结果三、三、计计算器:变量读入和输出算器:变量读入和输出1.1.编辑程序编辑程序2.2.添加可执行权限添加可执行权限3.3.运行程序运行程序四、四、比比较两个数字是否相等较两个数字是否相等1.1.编写程序编写程序2.2.添加可执行权限添加可执行权限3.3.运行程序运行程序五、五、循循环计算累加和环计算累加和1.1.编写程序编写程序2.2.添加可执行权限添加可执行权限3.3.运行程序运行程序六、利用六、利用 shellshell 函数计算两数之和函数计算两数之和1.1.编写程序编写程序2.2.添加可执行权限添加可执行权限3.3.运行程序运行程序七、计算数组累乘七、计算数组累乘1.1.编写程序编写程序2.2.添加可执行权限添加可执行权限3.3.运行程序运行程序八、八、实验总结实验总结通过本次实验,我学会了 shell 中的各种写法,包括流程控制,循环,数组,函数等等,了解到 shell 在 Linux 是一种强大的神器,可以批量完成各种操作。实 验 报 告组别实验项目名称姓名张正锟同组实验者实验日期第 13 周周四9,10 节实验三文件操作教师评语实验成绩指导教师一、一、实实验目标验目标1熟悉 cd、date、pwd、cal、who、echo、clear、passwd 等常用命令。?2掌握在用户主目录下对文件进行的操作:复制一个文件、显示文件内容、查找指定内容、排序、文件比较、文件删除等。?3学会对目录进行管理:创建和删除子目录、改变和显示工作目录、列出和更改文件权限、链接文件等。?二、二、文件操作:修改文件权限文件操作:修改文件权限设计一个程序,要求把系统中“/etc”目录下的 passwd 文件权限,设置成文件所有者可读可写,所有其他用户为只读权限。1.1.编写编写 C C 语言程序语言程序2.2.编译执行编译执行3.3.查看结果查看结果三、三、从终端读写数据从终端读写数据文件的打开可以用 open 函数,即使原来的文件不存在,也可以用 open 函数创建文件。在打开或者创建文件时,可以指定文件的属性及用户的权限等参数。关闭一个打开的文件,用 close 函数。当一个进程终止时,它所有已打开的文件都由内核自动关闭。1.1.编写编写 C C 语言程序语言程序2.2.查看运行结果查看运行结果四、文件上锁和锁的释放四、文件上锁和锁的释放1.1.题目要求题目要求设计一个程序,要求在“/root”下打开一个名为“5-11file”的文件,如果该文件不存在,则创建此文件。打开后对其加上强制性的写入锁 F_WRLCK,按回车后解锁 F_UNLCK,然后加上读出锁 F_RDLCK,按回车后再解锁 F_UNLCK。程序在终端 1 运行后会显示程序的进程号,再打开终端 2,会提示此文件处于锁定状态,此时在终端2 可以多按回车,观察程序的运行结果。然后在终端 1 按回车,等待终端 1 解锁后,在终端 2 才可锁定此文件,你可观察到强制性锁是独占状态,当在终端 2 解锁后,在终端 1 或 2 可加读出锁,在读出锁状态终端 1 或 2 的运行不需要等待,因为读出锁是处于共享状态,请编写程序并测试程序运行的结果。2.2.分析分析主程序先用 open 函数打开文件“5-11file”,如果该文件不存在,则创建此文件;接着调用自定义函数lock_set:先传递参数“F_WRLCK”给文件“5-11file”加锁,并打印输出给文件加锁进程的进程号,然后先传递参数“F_UNLCK”给文件“5-11file”解锁,并打印输出给文件解锁进程的进程号;在自定义函数 lock_set给文件上锁语句前,加上判断文件是否上锁的语句,如果文件已经被上锁,打印输出给文件上锁进程的进程号。3.3.编写编写 C C 语言程序语言程序4.4.执行程序执行程序终端终端 1 1:加上写入锁的是:5403释放强制性锁:5403文件已加上写入锁,其进程号是:5404文件已加上写入锁,其进程号是:5404文件已加上写入锁,其进程号是:5404加上读取锁的是:5403释放强制性锁:5403终端终端 2 2:文件已加上写入锁,其进程号是:5403文件已加上写入锁,其进程号是:5403文件已加上写入锁,其进程号是:5403加上写入锁的是:5404释放强制性锁:5404加上读取锁的是:5404释放强制性锁:5404五、五、流文件的打开和关闭流文件的打开和关闭带缓存的流文件 I/O 操作,是基于输入/输出(I/O)流机制的文件操作,又做文件流(File Stream)的操作。下面具体说明文件流的关闭与打开。1.1.题目要求题目要求设计一个程序,要求用流文件 I/O 操作打开文件“5-12file”,如果该文件不存在,则创建此文件。2.2.题目分析题目分析带缓存的基于输入/输出(I/O)流机制的文件操作时,打开文件用fopen 函数,关闭文件用 fclose 函数。3.3.程序编写程序编写4.4.运行结果运行结果可以看到程序运行后创建了”5-12file”文件六、实验总结六、实验总结通过本次实验,我掌握了 Linux 下用 C 语言读写文件的方法,包括带缓存和不带缓存的方法。另外也学会了用 C 语言修改文件权限等知识点。可以看出 Linux 和 C语言是浑然一体地,可以用 C 语言无缝地操作 Linux 系统。实 验 报 告组别实验项目名称姓名张正锟同组实验者实验日期第 14 周周四9,10 节实验四进程控制教师评语实验成绩指导教师一、一、实验目标实验目标1.理解进程的基本概念及进程的结构2.学会 Linux 环境下进程的相关函数的应用3.掌握守护进程的概念、启动和建立4.掌握进程操作程序的编写二、二、进程简介进程简介进程是正在执行中的程序。当我们在终端执行命令时,Linux 就会建立一个进程,而当我们的程序执行完成时,这个进程就被终止了。Linux 是一个多任务操作系统,允许多个用户使用计算机系统,多个进程并发执行。Linux 环境下启动进程有两种主要途径:手工启动和调度启动。三、三、程序显示进程号和父进程号程序显示进程号和父进程号在 Linux 环境下进程创建时,系统会分配一个唯一的数值给每个进程,这个数值就称为进程标识符(PID)。在 Linux 中进程标识有进程号(PID)和它的父进程号(PPID)。其中,PID 唯一地标识一个进程。PID 和 PPID 都是非零的正整数。在 Linux 中获得当前进程的 PID和 PPID 的系统调用为 getpid 和 getppid 函数。1.1.程序编写程序编写2.2.编译运行编译运行可看到,每次运行的 pid 都是不同的。四、子进程的创建四、子进程的创建进程调用 fork 函数创建一个新进程,由 fork 创建的新进程被称为子进程(childprocess)。该函数被调用一次,但返回两次,两次返回的区别是子进程的返回值是 0,而父进程的返回值则是新子进程的进程 PID。子进程和父进程继续执行 fork 之后的指令。子进程是父进程的复制品。例如,子进程获得父进程数据空间、堆和栈的复制品。注意,这是子进程所拥有的拷贝。父、子进程并不共享这些存储空间部分,通常父、子进程共享代码段1.1.编写编写 C C 语言程序语言程序2.2.运行程序运行程序五、进程的退出五、进程的退出1.1.题目要求题目要求设计一个程序,要求子进程和父进程都在显示输出一些文字后分别用exit 和_exit 函数终止进程。2.2.题目分析题目分析由于 printf 函数使用的是缓冲 I/O 方式,遇到”n”时自动将数据从缓冲区读出。可以看出,调用 exit 函数时,缓冲区中的记录能正常输出;而调用_exit 时,缓冲区中的记录无法输出。Linux 标准函数库中,有一种操作称为“缓冲 I/O”,每次读写文件时,都是在缓冲区里读取、写入。写入文件时,等满足一定条件才将缓冲区的内容一次性写入文件。但是,有时没有满足选定的条件,数据只存在缓冲区内,如果这时调用_exit函数直接关闭进程,缓冲区中的数据就会丢失。3.3.程序编写程序编写4.4.程序执行程序执行可以看到,程序只在父进程进行了输出。这是因为子进程调用了_exit()函数,没有进行缓冲区 IO 的刷新。六、实验总结六、实验总结通过本次试验,我了解了 Linux 的进程机制,学会了基本的进程创建,进程终止,学会了在Linux 下用 C 语言操作进程。了解到了Linux 是一个多任务操作系统,允许我们使用计算机系统,多个进程并发执行。实 验 报 告组别实验项目名称姓名张正锟同组实验者实验日期第 15 周周四9,10 节实验五线程练习教师评语实验成绩指导教师一、一、实实验目的验目的了解线程的基本概念掌握线程相关函数及应用理解线程同步互斥二、二、线线程概述程概述线程定义为进程内一个执行单元或一个可调度实体。在不拥有线程的进程概念中,进程既是一个拥有资源的独立单位,它可独立分配虚地址空间、主存和其它,又是一个可独立调度和分派的基本单位。在有了线程以后,资源拥有单位称为进程(或任务),调度的单位称为线程、又称轻进程(Light Weight Process,LWP)。多线程的进程在同一地址空间内包括多个不同的控制流,也即属于同一进程下的线程,它们共享进程拥有的资源,如代码、数据、文件等。线程也独占一些资源,如堆栈、程序计数器等。多线程系统的优点包括对用户响应的改进,进程内的资源共享,以及利用多处理器体系结构的便利。从实现的角度看,把线程分为用户级线程和内核级线程。用户级线程对程序员来说是可见的,而对内核来说是未知的,用户空间的线程库通常用以管理用户级线程,线程库提供对线程创建、调度和管理的支持。内核级线程由操作系统支持和管理,在内核空间实现线程创建、调度和管理。用户级线程与内核级线程相比,优点是创建和管理要更快;缺点是得到 CPU 的时间更少,当一个线程阻塞时,连累其它线程全部阻塞。三、三、共共享内存变量访问中冲突的现象享内存变量访问中冲突的现象1.1.关于线程同步与互斥关于线程同步与互斥当并发执行的线程共享数据时,各线程会改写共享的数据,由于 CPU 调度顺序的不确定性,造成线程运行结果的不确定性。所以,必须为共享数据的一组相互协作的线程提供互斥。一种思想是确保在任何时刻最多只能有一个线程执行这些访问共享数据的代码。这就是临界区互斥问题。线程在并发执行时为了保证结果的可再现性,各线程执行序列必须加以限制以保证互斥地使用临界资源,相互合作完成任务。多个相关线程在执行次序上的协调称为线程同步。用于保证多个线程在执行次序上的协调关系的相应机制称为线程同步机制。Pthread 线程库提供了多种方式来处理线程同步互斥机制,最常用的是互斥锁、条件变量和信号量。2.2.C C 语言程序编写语言程序编写3.3.程序执行程序执行编译并运行程序:结果是 10。我们创建两个线程,counter 的初值为 0,各自把 counter 增加 10 次,正常情况下最后 counter 应该等于 20四、实验总结通过本次实验,我学会了在 Linux 下使用 C 语言操作线程的方法,了解了线程和进程的区别,对于理解 Linux 的核心非常有帮助。实 验 报 告组别实验项目名称姓名张正锟同组实验者实验日期第 16 周周四9,10 节实验六网络编程教师评语实验成绩指导教师一、一、实实验目标验目标理解端口及 Socket 的基本概念掌握面向连接的 TCP 编程掌握面向非连接的 UDP 编程了解/O 多路利用的控制了解复杂网络程序的实现二、二、协协议概述议概述1.1.TCP/IPTCP/IP 协议协议TCP/IP 协议(Transmission Control Protocol/Internet Protocol)叫做传输控制/网际协议,又叫网络通信协议。TCP/IP 是 20 世纪 70 年代中期美国国防部为其 ARPANET 广域网开发的网络体系结构和协议标准,以它为基础组建的Internet是目前国际上规模最大的计算机网络。正因为 Internet 的广泛使用,使得 TCP/IP 成了事实上的标准。TCP/IP 虽然叫传输控制协议(TCP)和网际协议(IP),但实际上是一组协议,它包含了上百个功能的协议,如 ICMP、RIP、TELNET、FTP、SMTP、ARP、TFTP 等,这些协议一起被称为 TCP/IP 协议。2.2.UDPUDP 和和 TCPTCP 协议协议TCP 与 UDP 是两种不同的网络传输方式。两个不同计算机中的程序,使用 IP 地址和端口,要使用一种约定的方法进行数据传输。主要的区别是进行数据传输时是否进行连接。TCP:TCP 是一种面向连接的网络传输方式。这种方式可以理解为打电话。计算机 A 先呼叫计算机 B,计算机 B 接受连接后发出确认信息,计算机 A 收到确认信息以后发送信息,计算机 B 完成数据接收以后发送完毕信息,这时再关闭数据连接。所以 TCP 是面向连接的可靠的信息传输方式。这种方式是可靠的,缺点是传输过程复杂,需要占用较多的网络资源。UDP:UDP 是一种不面向连接的传输方式。可以简章理解成邮寄信件。将信件封装放入邮筒以后,不再参预邮件的传送过程。使用 UDP 传送信息时,不建立连接,直接把信息发送到网络上,由网络完成信息的传送。信息传递完成以后也不发送确认信息。这种传输方式是不可靠的,但是有很好的传输效率。对传输可靠性要求不高时,可以选择使用这种传输方式。3.3.套接字套接字Socket 是网络编程的一种接口,它是一种特殊的 I/O。在 TCP/IP 协议中,“IP 地址+TCP 或 UDP 端口号”可以唯一标识网络通讯中的一个进程,可以简单地认为:“IP 地址+端口号”就称为 socket。在 TCP 协议中,建立连接的两个进程各自有一个 socket 来标识,这两个 socket组成的 socket 对就唯一标识一个连接。用socket 函数建立一个 socket 连接,此函数返回一个整型的 socket 描述符,随后进行数据传输。一个完整的 socket 有一个本地唯一的 socket 号,由操作系统分配。最重要的是,socket 是面向客户/服务器模型而设计的。通常,socket 分为三种类型:流式 socket、数据报 socket 和原始 socket。注意:一个完整的 socket 有一个本地唯一的 socket 号,由操作系统分配。最重要的是,socket 是面向客户/服务器模型而设计的。三、三、设设计服务器计服务器-客户端通信程序客户端通信程序1.1.编写服务端程序编写服务端程序#include%s ServerIPAddressn,argv0);exit(1);/设置一个 socket 地址结构 client_addr,代表客户机 internet 地址,端口struct sockaddr_in client_addr;bzero(&client_addr,sizeof(client_addr);/把一段内存区的内容全部设置为0=AF_INET;?/internet协议族=htons(INADDR_ANY);/INADDR_ANY表示自动获取本机地址=htons(0);?/0表示让系统自动分配一个空闲端口/创建用于 internet 的流协议(TCP)socket,用 client_socket 代表客户机 socketint client_socket=socket(AF_INET,SOCK_STREAM,0);if(client_socket 0)printf(Create Socket Failed!n);exit(1);/把客户机的 socket 和客户机的 socket 地址结构联系起来if(bind(client_socket,(struct sockaddr*)&client_addr,sizeof(client_addr)printf(Client Bind Port Failed!n);exit(1);/设置一个 socket 地址结构 server_addr,代表服务器的 internet 地址,端口struct sockaddr_in server_addr;bzero(&server_addr,sizeof(server_addr);=AF_INET;if(inet_aton(argv1,&=0)/服务器的 IP 地址来自程序的参数printf(Server IP Address Error!n);exit(1);=htons(HELLO_WORLD_SERVER_PORT);socklen_t server_addr_length=sizeof(server_addr);/向服务器发起连接,连接成功后 client_socket 代表了客户机和服务器的一个socket 连接if(connect(client_socket,(struct sockaddr*)&server_addr,server_addr_length)BUFFER_SIZEBUFFER_SIZE:strlen(file_name);/向服务器发送 buffer 中的数据send(client_socket,buffer,BUFFER_SIZE,0);/int fp=open(file_name,O_WRONLY|O_CREAT);/if(fp 0)FILE*fp=fopen(file_name,w);if(NULL=fp)printf(File:t%s Can Not Open To Writen,file_name);exit(1);/从服务器接收数据到 buffer 中bzero(buffer,BUFFER_SIZE);int length=0;while(length=recv(client_socket,buffer,BUFFER_SIZE,0)if(length 0)printf(Recieve Data From Server%s Failed!n,argv1);break;/int write_length=write(fp,buffer,length);int write_length=fwrite(buffer,sizeof(char),length,fp);if(write_lengthlength)printf(File:t%s Write Failedn,file_name);break;bzero(buffer,BUFFER_SIZE);?printf(Recieve File:t%s From Server%s Finishedn,file_name,argv1);close(fp);/关闭 socketclose(client_socket);return 0;2.2.测试结果测试结果当同时运行客户端和服务端程序后,只要在客户端建立一个帐号,双方就可以收发数据了。四、四、实实验总结验总结通过本次实验,我学会了在 Linux 操作系统下,设计服务端和客户端程序的基本方法,了解了 socket 通信的重要性,同时也复习了在 计算机网络 中学到的 TCP、UDP、IP 和端口等知识。