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