linux编程大作业
- 格式:doc
- 大小:520.00 KB
- 文档页数:19
简单的IRC聊天程序—— Linux课程期末实验第一章概述【实验目的】综合应用Linux系统下的网络编程技术,使用C语言,结合软件工程思想,设计并实现一个简单的IRC聊天程序,具有服务器端和客户端,可以是终端字符界面,支持用户管理,用户名/密码注册和登录,支持版面聊天,用户可以选择进入某个版面,版面发言大家可以看到,同时支持点对点私聊,可以选择某个用户进行私聊。
从而熟悉在Linux系统所提供的网络通信接口及该系统下的编程思想,深入对计算机系统的理解,并切实提高软件设计开发的能力。
【实验原理】一个简单的聊天室,其功能是当这个聊天室中的任何一个用户输入一段字符后,室内的其他用户都可以看到这句话。
据此,聊天程序分为客户端和服务器端。
客户端对应每一个参加聊天的用户,完成从终端上输入采集并传递到服务器端和从服务器端接收信息输出显示的功能。
总体介绍该结构如下。
首先是初始化服务器,使服务器进入监听状态:sockfd = socket(AF_INET, SOCK_STREAM, 0);// 首先建立一个socket,族为AF_INET,类型为SOCK_STREAM。
// AF_INET = ARPA Internet protocols,即使用TCP/IP协议族。
// SOCK_STREAM类型提供了顺序的,可靠的,基于字节流的全双工连接。
// 由于该协议族中只有一个协议,因此第三个参数为0。
bind(sockfd, (struct sockaddr *)&servaddr,sizeof(serv_addr));// 再将这个socket与某个地址进行绑定。
// serv_addr 包括sin_family=AF_INET 协议族同socket。
// sin_addr.s_addr = htonl(INADDR_ANY)服务器所接收的所有其他地址// 请求建立的连接。
// sin_port = htons(SERV_TCP_PORT) 服务器所监听的端口。
武汉轻工大学数学与计算机学院2019-2020学年第一学期Linux大作业指导老师: **专业:信息管理与信息系统班级:信管1601班学号: ***********姓名: **2019年10月29 日历史1991年,还在芬兰赫尔辛基大学上学的Linus Torvalds在自己的Intel 386计算机上开发了属于他自己的第一个程序,并利用Internet发布了他开发的源代码,将其命名为Linux,从而创建了Linux操作系统,并在同年公开了Linux的代码,从而开启了一个伟大的时代。
在之后的将近30年的时间里,越来越多的工程师投入到Linux,帮助不断完善Linux的功能。
现在的Linux系统架构凭借优秀的分层和模块化的设计,融合了大量的设备和不同的物理架构。
这篇文章,也是对Linux系统的一个非常简单的介绍,主要讲解Linux的进程调度、内存管理、设备驱动、文件系统、网络模块。
Linux内核架构图上图就是Linux内核的架构图,从硬件层--->操作系统内核--->应用层,这套系统架构的设计应用于各类软硬件结合的系统上,比如物联网系统,单片机系统、机器人等领域。
进程调度进程在Linux系统中称为process或task。
操作系统中进程的数据结构包含很多元素,诸如:地址空间、进程优先级、进程状态、信号量、占用的文件等,往往用链表链接。
CPU在每个系统滴答(Tick)中断产生的时候检查就绪队列里边的进程(遍历链表中的进程结构体),如有符合调度算法的新进程需要切换,保存当前运行的进程的信息(包括栈、地址等)后挂起当前进程,然后运行新的进程,这就是进程调度。
CPU调度的基本依据是进程的优先级。
调度的终极目标是让高优先级的进程能及时得到CPU的资源,低优先级的任务也能公平的分配到CPU资源。
不过因为保存当前进程的信息所以进程的切换本身是有成本的,调度算法同样需要考虑效率。
在早期Linux内核中,就是采用轮询算法来实现的,内核在就绪的进程队列中选择高优先级的进程执行,每次运行相等时间,该算法简单直观,但仍然会导致一些低优先级的进程长时间不能执行。
《信息技术》课程论文《Linux课程论文》学生姓名张振东学号5011210108专业计算机科学与技术班级计算机14-1所属学院信息工程学院塔里木大学教务处制引言Linux是一套免费使用和自由传播的类Unix操作系统,是一个基于POSIX和UNIX的多用户、多任务、支持多线程和多CPU的操作系统。
它能运行主要的UNIX工具软件、应用程序和网络协议。
它支持32位和64位硬件。
Linux 继承了Unix以网络为核心的设计思想,是一个性能稳定的多用户网络操作系统。
它主要用于基于Intel x86系列CPU的计算机上。
这个系统是由全世界各地的成千上万的程序员设计和实现的。
其目的是建立不受任何商品化软件的版权制约的、全世界都能自由使用的Unix兼容产品。
Linux以它的高效性和灵活性著称,Linux模块化的设计结构,使得它既能在价格昂贵的工作站上运行,也能够在廉价的PC机上实现全部的Unix特性,具有多任务、多用户的能力。
它还包括带有多个窗口管理器的X-Windows图形用户界面,如同我们使用Windows NT一样,允许我们使用窗口、图标和菜单对系统进行操作。
Linux是一种自由和开放源码的类Unix操作系统。
目前存在着许多不同的Linux,但它们都使用了Linux内核。
Linux可安装在各种计算机硬件设备中,从手机、平板电脑、路由器和视频游戏控制台,到台式计算机、大型机和超级计算机。
Linux是一个领先的操作系统,世界上运算最快的10台超级计算机运行的都是Linux操作系统。
严格来讲,Linux 这个词本身只表示Linux内核,但实际上人们已经习惯了用Linux来形容整个基于Linux内核,并且使用GNU 工程各种工具和数据库的操作系统。
Linux得名于计算业余爱好者Linus Torvalds。
Linux操作系统,确切地说是GNU/Linux操作系统。
它的诞生、发展与UNIX、MINIX操作系统、GNU计划、POSIX标准以及Internet广泛应用有着极大的关系。
大作业 ( 一 )一:填空题1:Linux中除图形登录外还可以使用命令提示行进行登录。
2:如果要访问网络中的另一台电脑,可以通过命令方式进行登录。
3: shell 是一个类似于 dos 的命令行解释工具。
4:Shell的概念最初是在__unix____操作系统中形成和得到广泛应用的。
5:Linux中的Shell有多种类型,其中最常用的几种是 Bourne Shell sh 、C Shell(csh)和Korn Shell(ksh).6:Bourne Shell简称 sh 。
7:创建名为p的用户可以通过 useradd p 命令进行创建。
8:为名为p的用户创建密码可以通过 passwd p 命令进行创建。
9:删除名为p的用户可以通过 userdel p 命令进行。
10:mv命令用来移动文件,cp命令用来复制文件。
11:当在Shell环境中启动vi编辑器时,可以使用 vi 命令进行启动。
12:当在vi编辑器中输入文字时,需要按键盘中的 I 键才可以进行输入。
13:在命名文件时不可以使用/、:、 \、 *、?、 % 、 >、|等符号。
14:root用户账户的基本信息保存在 /root/. 文件中。
15:在账户记录文件“root: x: 0: 0: root: /root: bin/bash”代码中的“bin/bash”表示 Bourne Again shell 。
16:当其他用户登录后要切换到root用户账户时,可以通过 su 命令进行。
17:当需要修改root用户账户时,需要在用户设置窗口中选择新建选项后才可以进行。
18:除了root用户账户外,还有lp、mail、uucp、 news 和 halt 这些默认的系统账户。
19:在Linux中权限最大的组是 root组,该组具备Linux操作的所有权限。
20:在Linux中可以使用 fdisk 或 df 命令查看磁盘分区情况。
21:当需要使用kill命令关闭编号是2547的程序时,其书写方式是 kill-9 2547 。
第四章 Linux编程作业参考答案一,AWK命令行应用1)处理/etc/passwd文件a)打印第一列(userid)提示:awk -F 分隔符‘{print $第几列}’fileb)打印root用户的1,2 field2)打印用户home目录下所有文件的:owner和文件名(只打印这两列)提示:使用ls -l 和 awk3)打印所有登录本机器的ip,并去掉重复。
提示:使用last,awk,sort,uniq二,AWK完整流程创建order文件 (商品名,数量,单价)apple 20 6.5orange 10 8grape 7 12berry 5 32输出格式 awk -f order.awk order (参考employee.awk)name count price (表头)apple 20 6.5...=================== (表尾)order.awkBEGIN{print "name\tcount\tprice"; OFS="\t"}{print $1,$2,$3}END{print "=========================\n"}三,AWK变量,计算使用order文件 (商品名,数量,单价)apple 20 6.5orange 10 8grape 7 12berry 5 32输出格式:awk -f order2.awk ordername count price total...Number of item: Total count: Order total price:order2.awkBEGIN{print "name\tcount\tprice\ttotal"; OFS="\t"; total=0; totalCount=0;} {totalCount += $2;total += ($2 * $3);print $1, $2, $3, $2*$3}END{printf "Number of item: %d, Total count: %d, Order total price: %.2f\n", NR, totalCount, total}四、AWK donation作业Mike:Harrington:(510) 548-1278:250:100:175Christian:Dobbins:(408) 538-2358:155:90:201Susan:Dalsass:(206) 654-6279:250:60:50Archie:McNichol:(206) 548-1348:250:100:175Jody:Savage:(206) 548-1278:15:188:150Guy:Quigley:(916) 343-6410:250: 100:175Dan:Savage:(406) 298-7744:450:300:275Nancy:McNeil:(206) 548-1278:250:80:75John:Goldenrod:(916) 348-4278:250:100:175Chet:Main:(510) 548-5258:50:95:135Tom:Savage:(408) 926-3456:250:168:200Elizabeth:Stachelin:(916) 440-1763:175:75:300donation2.awkBEGIN{FS=":"; total = 0; max = 0; i = 0;print " *** FIRST QUARTERLY REPORT *** ";print " *** CAMPAIGN 2000 CONTRIBUTIONS *** ";print "-------------------------------------------------------------------------------";printf("%20s %15s %8s %8s %8s %15s\n", "NAME","PHONE", "Jan", "Feb", "Mar", "Total Donated");print "-------------------------------------------------------------------------------";}{name=$1 " " $2;subtotal=$4+$5+$6;total = total + subtotal;if (subtotal > 500) { names[i] = name; phone[i] = $3; lastToIndex[$2 $3]=i; i++}if (subtotal > max) { max = subtotal; max_name=name; max_first=$1;}printf("%20s %15s %8.2f %8.2f %8.2f %15.2f\n", name, $3, $4, $5, $6, subtotal);}END{print "-------------------------------------------------------------------------------";print " SUMMARY"print "-------------------------------------------------------------------------------";printf ("The campaign received a total of $%.2f for this quartar.\n", total); printf ("The average donation for the %d contributors was $%0.2f.\n", NR, total/NR);printf ("The highest total contribution was $%0.2f made by %s.\n", max, max_name);printf (" *** THANKS %s***\n", max_first);printf ("The following people donated over $500 to the campaign.\n");printf ("They are eligible for the quarterly drawing!!\n");printf ("Listed are their names (sorted by last name) and phone numbers:\n");len=asorti(lastToIndex, sortname);for (i = 1; i <= len; i++) {ii = lastToIndex[sortname[i]];printf (" %s--%s\n", names[ii], phone[ii]);}printf (" Thanks to all of your continued support!!\n");}运行结果:五、Shell 变量写一个脚本weather.sh,完成下面功能:外部定义环境变量:export weather=”Sunny”输入What’s your name? (echo, read)Which city do you live? (echo, read)输出:Hi “名字”,the weather of “城市” is“定义的weather”执行脚本:chmod u+x weather.sh; ./weather.sh外部定义局部变量weather1, 使用source执行?#!/bin/bashread -p "What's your name?" nameread -p "Which city do you live?" cityecho "hi $name, the weather of $city is $weather. Local weather is $weather1."六、Shell String pattern match创建一个脚本:ip_match.sh用户输入一个string,判断是否是IPv4地址yes: 输出This is an IPv4 addressno: 输出Wrong address提示: IPv4 regex: ([0-9]{1,3}\.){3}[0-9]{1,3}#!/bin/bashpattern='([0-9]{1,3}\.){3}[0-9]{1,3}'echo "Input a string"read strif [[ $str =~ $pattern ]]; thenecho "This is a ipv4 address: $str"elseecho "Wrong address! $str"fi七、Shell 文件条件判断输入:please input a file name:逻辑:如果文件已经存在:the file already exites不存在,新建一个空文件,名字为输入的string。
Linux信号量机制1 需求说明1.1 基本需求目标:本次实验的目标是在Linux环境下实现一个多线程对临界资源的互斥操作,利用信号量实现对临界资源的保护,支持Linux下文件输入输出,提高对Linux环境下多进程、多线程、信号量机制和文件操作等知识的理解。
问题描述:设有进程A、B、C,分别调用过程get、copy、put对缓冲区S和T进行操作。
其中get负责从文件F_in中把数据块读入并输出缓冲区S,copy负责从S中提取数据块并复制到缓冲区T中,put负责从缓冲区T中取出信息存入到本地文件F_out中。
实现get、copy、put的操作过程。
功能需求:●提供与用户交互的界面,用户可指定输入、输出文件以及缓冲区大小●利用信号量(互斥量和条件变量)实现互斥●同时产生多个get、copy和put线程,利用信号量实现多个相同功能的线程间的通信,避免临界资源的非法访问,可参考读写者问题解决方案●支持文件输入、输出非功能需求:●程序应有较好的容错性(即能对用户输入的命令进行判断,并对错误的命令进行错误处理)过程需求:●使用vi进行代码的编写●使用make工具建立工程●将实现不同类别功能的函数写到不同的.c文件中,并使用makefile链接编译。
OBJS=main.o copy.o get.o put.o file.o signalmove:$(OBJS)signalmove.hgcc$(OBJS)-o signalmove-lpthread main.o:main.c signalmove.hgcc-c main.c-lpthreadcopy.o:copy.c signalmove.hgcc-c copy.cget.o:get.c signalmove.hgcc-c get.cput.o:put.c signalmove.hgcc-c put.cfile.o:file.c signalmove.hgcc-c file.c/**signalmove.h**Created on:May14,2012*Author:dell*/#ifndef SIGNALMOVE_H_#define SIGNALMOVE_H_#include<stdio.h>#include<stdlib.h>#include<unistd.h>#include<pthread.h>#include<semaphore.h>#include<signal.h>#include<fcntl.h>#include<string.h>#include<ctype.h>//file worksvoid file_in();void file_out();//copy from s to tvoid copy();//put and getvoid put();void get();sem_t read_sem;//readsem_t write_sem;//writesem_t copy_sem;//copypthread_mutex_t read_mutex;//pthread mutex for read pthread_mutex_t write_mutex;//pthread mutex for writechar*data_s;//read bufferchar*data_t;//write bufferint len;//buffer lengthchar*filename_out;//name_outchar*filename_in;//name_inint result;int result_copy;#endif/*SIGNALMOVE_H_*//**main.c**Created on:May14,2012*Author:dell*/#include"signalmove.h"int isdigit_all(char*str){while(*str!='\0'){if(!isdigit(*str++))return0;}return1;}//signal outvoid Handlesignal(int signo){printf("end program!\n",signo);exit(0);}void main(int argc,char*argv[]){if(argc!=4){printf("error input!1.filename_in,2.filename_out,3,length of buffer\n"); exit(0);}if(isdigit_all(argv[3])==0){printf("error input!1.filename_in,2.filename_out,3,length of buffer\n"); printf("error length of buffer must be digit!\n");exit(0);}result_copy=0;filename_in=argv[1];filename_out=argv[2];len=atoi(argv[3]);int thread_i=0;data_s=(char*)malloc(len*sizeof(char));data_t=(char*)malloc(len*sizeof(char));if(signal(SIGINT,Handlesignal)==SIG_ERR){printf("error signal out\n");}pthread_t read_pthread;pthread_t copy_pthread;pthread_t write_pthread;//sem lockint ini1=sem_init(&read_sem,0,1);int ini2=sem_init(&write_sem,0,0);int ini5=sem_init(©_sem,0,0);if(ini1&&ini2&&ini5!=0){printf("sem error\n");exit(1);}//mutex lockint ini3=pthread_mutex_init(&read_mutex,NULL);int ini4=pthread_mutex_init(&write_mutex,NULL);if(ini3&&ini4!=0){printf("mutex error\n");exit(1);}int thread_1=pthread_create(&read_pthread,NULL,(void*)&get, (void*)(&thread_i));if(thread_1!=0){printf("read thread create error!\n");exit(1);}thread_i++;int thread_2=pthread_create(©_pthread,NULL,(void*)©, (void*)(&thread_i));if(thread_2!=0){printf("copy thread create error!\n");exit(1);}thread_i++;int thread_3=pthread_create(&write_pthread,NULL,(void*)&put, (void*)(&thread_i));if(thread_3!=0){printf("write thread create error!\n");exit(1);}pthread_join(read_pthread,NULL);pthread_join(copy_pthread,NULL);pthread_join(write_pthread,NULL);free(data_s);free(data_t);exit(0);}/**file.c**Created on:May14,2012*Author:dell*file works*/#include"signalmove.h"void file_in(int fd,char*data,int len){while(1){sem_wait(&read_sem);pthread_mutex_lock(&read_mutex);printf("data_in..........\n");if(lseek(fd,0,SEEK_CUR)==-1){printf("lseek failed!\n");}if((result=read(fd,data,len))==-1){printf("read error!\n");}int i=0,j=0;printf("data_plete\n");pthread_mutex_unlock(&read_mutex);sem_post(©_sem);if(result<len){len=result;result=0;break;}}}void file_out(int fd,char*data,int len){while(1){sem_wait(&write_sem);pthread_mutex_lock(&write_mutex);printf("data_out..........\n");if(write(fd,data,len)==-1){printf("write error!\n");}printf("data_plete\n");pthread_mutex_unlock(&write_mutex);if(result_copy==1){break;}}}/**put.c**Created on:May14,2012*Author:dell*/#include"signalmove.h"void put(){int fd=open(filename_out,O_CREAT|O_RDWR,S_IRUSR|S_IWUSR); if(fd==-1){printf("open file wrong!\n");exit(0);}file_out(fd,data_t,len);}/***Created on:May14,2012*Author:dell*/#include"signalmove.h"void get(){int fd=open(filename_in,O_CREAT|O_RDWR,S_IRUSR|S_IWUSR); if(fd==-1){printf("open file wrong!\n");exit(0);}file_in(fd,data_s,len);}/**copy.c**Created on:May14,2012*Author:dell*copy data from S to T*/#include"signalmove.h"void copy(){while(1){sem_wait(©_sem);pthread_mutex_lock(&read_mutex);pthread_mutex_lock(&write_mutex);printf("copy..........\n");strcpy(data_t,data_s);int i=0;for(;i<len;i++){data_s[i]='';}printf("plete\n");pthread_mutex_unlock(&write_mutex);pthread_mutex_unlock(&read_mutex);sem_post(&write_sem);sem_post(&read_sem);if(result==0){result_copy=1;break;} }。
一、为企业架设web服务器,要求:1.建立WEB服务器,服务器名为,网站主目录为/var/xx/www,站点主页文件的搜索顺序为index.html index.php;服务器启动时的子进程数为5;使用端口为80。
网页内容为:班级名称,用户名,192.168.yy.12,2.每个同学为自己建立个人主页空间,在/home下对自己做限额,软配额限制15M,硬配额限制60M, i节点数不受限制。
每个同学都属于gp组,组的限额是用户限额的50倍。
网页内容为:学号,用户名,192.168.yy.12,/home/用户名/www 其中:XX为同学名字的最后一个字的拼音,yy为同学学号的后两位数字,十位为0的只取个位数字。
评分标准:1. 正确安装DNS和apache并配置地址。
(10分)2. 正确配置dns,添加主机记录,并能够正常解析的。
(30分)3. 正确配置站点,建立主页,建立用户及个人主页,并能正常访问。
(30分)4. 正确设置配额。
(20分)5. 将配置及测试过程整理成文档,格式规范,步骤完整、图表清晰。
(10分)二、为企业架设ftp服务器1.建立FTP服务器,服务器名字为,服务器的欢迎语为“welcometo login ftpserver”.允许匿名用户上传下载文件,匿名用户的根目录为/var/ftp/pub,匿名用户的最大传输速率为10Kb/s.2.为自己和自己前后相邻的两个同学建立账户(只有一个相邻的,就建立一个),账户名字为姓名的全拼,允许本地用户访问,禁止相邻两个同学的账号切换到主目录以外的目录。
3.对/home做磁盘限额,用户的软配额限制15M,硬配额限制60M, i节点数不受限制。
每个同学都属于gp组,组的限额是用户限额的50倍。
4.将windows主机的一个txt文件上传到ftp服务器,文档的内容为:姓名,学号,windows主机ip,192.168.yy.13.其中:XX为同学名字的最后一个字的拼音,yy为同学学号的后两位数字,十位为0的只取个位数字。
LINUX系统与程序设计2011春本科生大作业------------------------------------------1. Shell编程:查询系统最近1000条命令中使用最多的前10条命令,编写Shell脚本实现此功能。
写出具体代码和操作过程。
------------------------------------------# echo $HISTSIZE 1000# history | awk '{CMD[$2]++;count++;}END { for (a in CMD)print CMD[a] " " CMD[a]/count*100 "% " a;}' | grep -v "./" | column -c3 -s " " -t | sort -nr | nl | head -n10解释:第一行的echo $HISTSIZE 1000是设置history中记录1000条命令;第二行中用awk 统计history 中的命令部分出现的次数,去掉“./" 这样不算命令的情况,最后排序输出,列出前10 个负责统计最近1000条命令中使用最多的10条命令。
-------------------------------------------2. Linux操作系统的系统配置文件默认储存在/etc目录下,因此管理员可以通过查看相应的文件来得知系统配置信息。
编写一个shell脚本显示下列系统配置信息:(1)CPU相关信息:如处理器类型,速度等;(2)内存信息;(3)挂载文件信息。
-------------------------------------------说明:通过在网上查到的资料,以及ls对/etc目录的列表,没有发现系统配置信息存在于/etc 中,而应该是/proc中。
一、使用命令行创建用户,以自己的班级学号姓名命名(阐述命令及参数的用法,粘贴运行结果截图,共1题,每题5分,共5分)。
useradd命令可以创建新用户或者更新默认新用户的信息,一般格式为:useradd [选项] 用户名。
建立一个新用户之后还要使用passwd命令为新用户设置密码。
二、以新创建的用户登录,设计一个shell程序脚本,名称为array.sh,利用数组形式求出斐波那契数列前20项及总和,完成以下操作(共4题,第1题20分,第2,3,4题每题5分,共35分):(1)画出程序流程图,书写源代码。
(2)显示脚本的全部内容,输出到文档中,文档以自己的班级学号姓名命名(阐述使用的命令及参数功能,粘贴运行截图。
cat:连接文件并打印到标准输出设备上命令>>文件:把命令的输出附加到指定文件的后面,该文件原有内容不被破坏(3)使用三种方式运行脚本,结果添加到文档中,文档以自己的班级学号姓名命名(阐述三种方式用法及区别,粘贴运行截图)。
bash 脚本名 [参数]. 脚本名 [参数]:以当前shell执行一个shell脚本chmod a+x 脚本名 :利用chmod将shell脚本设置为对所有用户都有执行权限,然后用路径名称方式 ./脚本名执行当前工作目录下的array.sh文件(4)将文档进行压缩,生成压缩文件(阐述使用的压缩命令,粘贴运行截图)。
gizp [选项] [压缩文件的名称]:被压缩的文件扩展名为.gz,并且保持原有的存取权限,访问与修改时间。
如果不指定文件,或者文件名为”-”,则将标准输入压缩为标准输出,gizp命令只压缩普通文件,他忽略符号链接文件。
二、配置NFS服务器端和NFS客户端,服务器端共享shell编程中得到的压缩文件,客户端查看共享文件。
要求写出详细配置步骤,粘贴运行截图,对结果进行分析。
(共1题,每题30分,共30分)主要实验步骤服务器端:1.确定vmware station中存在两个linux系统:2.使用ifconfig查看这两个系统的ip地址,如果提示没有ifconfig这个命令,则使用yum install ifconfig安装:192.168.43.148可以充当NFS服务器,192.168.43.47可以作为客户端(192.168.43.148也可以作为客户端,192.168.43.47为服务器端)。
Linux程序设计期末大作业报告学院:专业:年级:级学生姓名:学生学号:任课教师姓名:任课教师职称:讲师摘要●对linux的简单认识操作系统是计算机最重要的系统软件,是计算机应用的基础.Unix系统是迄今为止最优秀的操作系统,虽历经几十年,有许多变化,但基本的体系结构保持稳定。
Linux是一种自由和开放源码的类Unix操作系统。
目前存在着许多不同的Linux,但它们都使用了Linux 内核。
Linux可安装在各种计算机硬件设备中,从手机、平板电脑、路由器和视频游戏控制台,到台式计算机、大型机和超级计算机。
Linux是一个领先的操作系统,世界上运算最快的10台超级计算机运行的都是Linux操作系统。
●作业简要概述本课程大作业共有两个题,一个是shell编程,如实现自己模拟shell下的cd、ls 指令等,要求说明程序主要功能,每行给出注释;另一题是一个二选一,选择了简单的聊天室程序设计,该题要求设计并实现简单的聊天室程序,可以是终端字符界面,支持用户管理,用户名/密码注册和登录,客户端登陆到服务器聊天后,可以在聊天室内与其他用户交流(这个聊天室中的任何一个用户输入一段字符后,室内的其他用户都可以看到这句话)。
据此,聊天程序分为客户端和服务器端。
客户端对应每一个参加聊天的用户,完成从终端上输入采集并传递到服务器端和从服务器端接收信息输出显示的功能。
在实验报告中针对代码给出了对应的注释和自己的理解。
关键字:Linux;shell编程;聊天室程序2目录摘要........................................................................................................... 2目录........................................................................................................... 3一、期末大作业的目的 .............................................................................. 4二、大作业的基本要求 .............................................................................. 4三、大作业内容......................................................................................... 41、作业题目一............................................................................................................................. 4shell编程1 ............................................................................................................................. 4shell编程2 ............................................................................................................................. 62、作业题目二............................................................................................................................. 8程序代码 ................................................................................................................................... 8运行截图 ............................................................................................................................... 15四、小结(设计中的优点、不足及改进).............................................. 17五、参考文献....................................................................................... 19大作业评分表 ........................................................................................ 203一、期末大作业的目的《Linux程序设计》大作业是在完成理论课程学习之后,通过大作业的方式对学生进行综合实践考核,在学生掌握Linux的基本编程知识及常用的操作命令基础上,提高学生对所学知识的应用能力,特别是:煅炼学生搜集有关Linux资料,在资料文档的帮助下,运用Linux的基本知识及常用的操作命令来解决问题的能力。
第一部分 简述题目 要求:这部分题目必做,要详细回答,最好用自己理解的语言回答,有些题目可用图形和举例等阐述问题。 1、makefile文件的作用是什么,makefile文件中有一种变量,其值是根据具体的规则来确定的,称为自动变量,其中代表所有依赖文件列表的是哪个;举例说明make命令的工作流程。 答:在Makefile文件中描述了整个工程所有文件的编译顺序、编译规则。其中包括:工程中的哪些源文件需要编译以及如何编译、需要创建那些库文件以及如何创建这些库文件、如何最后产生我们想要的可执行文件。Makefile 有自己的书写格式、关键字、函数。在Makefile 中可以使用系统shell所提供的任何命令来完成想要的工作。能够使用一行命令来完成“自动化编译”。 自动变量$^代表所有依赖文件,以空格分开,以出现的先后为序。
2、什么是进程,用fork()创建一个子进程时,系统会做什么工作。请编程说明。 答:进程是具有独立功能的程序关于某个数据集合上的一次运行活动,是系统进行资源分配的单位,不仅是系统内部独立运行的实体也是独立竞争资源的实体。 用fork()时系统会分配子进程一个ID号 然后继承父进程的地址空间,包括进程上下文 进程堆栈 打开的文件描述符等等,他就是父进程的一个复制品。
3、简述Linux文件系统通过i节点把文件的逻辑结构和物理结构转换的工作过程。解释i节点在文件系统中的作用。 答:文件系统建立在由若干连续的逻辑块构成的存储空间中,根据用途逻辑块可分为:超级块、i节点区和数据区。其中i节点区用于存放i节点,每个文件都有各自唯一的i节点,i 节点是一个64字节长的表,表中包含了文件的相关信息,其中有文件的大小、文件所有者、文件的存取许可方式以及文件的类型等重要信息。在i节点表中最重要 的内容是磁盘地址表。在磁盘地址表中有13个块号,文件将以块号在磁盘地址表中出现的顺序依次读取相应的块。Linux文件系统通过把i节点和文件名进行 连接,当需要读取该文件时,文件系统在当前目录表中查找该文件名对应的项,由此得到该文件相对应的i节点号,通过该i节点的磁盘地址表把分散存放的文件物 理块连接成文件的逻辑结构。
4、文件指针FILE*与文件描述符是一个什么样的关系,请画图说明。 答:在linux系统中,一个文件可以被多个线程共享,每个进程在内核中用task_struct结构表示,其中有一个称为文件描述符表的fd,文件描述符表fd,是一个指针数组,每个指针指向一个file结构,用于记录一个打开文件的状态信息,其中f_pos记录打开文件的当前读写位置,f_dentry打开文件所在目录,f_op文件具体的操作集,打开文件就会获得文件描述符,它是个很小的正整数。每个进程在PCB(Process Control Block)中保存着一份文件描述符表,文件描述符就是这个表的索引,每个表项都有一个指向已打开文件的指针。
5、简述与windows的文件系统相比,linux文件系统有什么特点,并用图详细描述。 答:Linux的每个目录都可能是一个分区,在安装Linux时至少有两个分区,根分区和swap分区,其它的分区都安装在根下面。如将一个分区安装在/var下面,每个分区安装的位置成为“挂载点”,如挂载点/var。swaP分区大小是内存的2倍,等价于Windows的虚拟内存。根分区文件类型一般选择为ext3,swap分区类型即为swap。Linux中文件和目录都区分大小写,如home和Home不是一个目录。Linux把文件的i-nod信息全都交给了目录管理。包括文件存不存在、文件名是什么、文件存放在磁盘哪里等信息。只要有这个目录的写权限,就可以删除目录下的任意文件(注:这里的文件不包括目录)和更改目录下的任意文件的文件名(注:包括目录)。特别的,对于目录,如果这个目录只是一个空目录的话,就相当于一个文件,完全可以删除。但是因为Linux不能删除一个非空的目录。Linux中有一些重要的系统目录,它们都有特定的用途。Linux文件系统建立在由若干连续的逻辑块构成的存储空间中,根据用途逻辑块可分为:超级块、i节点区和数据区。
6、Linux创始人是谁,Linux操作系统的诞生、发展和成长过程始终依赖着的重要支柱有哪些,并描述Linux的特点。 答:linux的创始人是芬兰赫尔辛基大学生Linus Torvalds。Linux操作系统的诞生、发展和成长过程始终依赖着的重要支柱有:(1)UNIX操作系统、(2)MINIX系统、(3)GUN计划、0(4)POSIX标准、(5)Internet网络。 Linux的特点: 1.模块化程度高 2.源代码公开 3.广泛的硬件支持 4.安全性及可靠性好 5.具有优秀的开发工具 6.有很好的网络支持和文件系统支持 7.与UNIX完全兼容
7、为什么要学习Linux开源技术。 答:因为Linux具有可靠的系统安全,而且开源最安全: (1)、基于Linux操作系统的文件系统安全可靠,即限定操作系统存储物理空间,并使其不可被改写。将操作系统安装在相对独立的物理空间中,同时将安装操作系统的物理存储介质限定为只读方式,使所安装的操作系统在物理层上就不可被改写,达到安全可靠;同时将用户空间在物理上与系统空间相互隔绝,当用户需要安装软件或保存各种文档时,可以透明地存储在该空间中。 (2)、用户/文件权限的划分 用户权限在Windows操作系统里也不陌生,但是Linux操作系统的用户权限和文件权限要比Windows操作系统里严格有效。比较明显的一个案例就是,即便在Windows操作系统里设置了多用户,但是不同的用户之间通过一定的方式,还是能够互访文件的,这就失去了权限的意义。而LinuX可以对每一个文件进行授权,用户只能对自己有权限的文件进行权限范围内的操作,而且在实际使用中,root用户一般只在对系统进行维护时,如添加新用户,安装应用程序等才进行登录,一般都是以普通用户身份登录,普通用户不能修改系统文件夹下的文件,因此Linux下病毒软件想修改系统程序,根本没有可能性,大大增加了系统的安全性和可靠性。
8、Linux的主要组成包括什么。 答:Linux的主要组成包括:Linux内核、shell命令解释器、管理工具、图形用户界面。
9、什么是系统调用?系统调用是通过什么方式陷入内核态的?请写出你对系统调用的理解。什么是文件I/O和标准I/O库?文件I/O和标准I/O库的区别? 答:系统调用是指操作系统提供给用户程序调用的一组特殊接口,用户程序可以通过这组接口获得操作系统内核提供的服务。 系统调用是通过软件中断方式陷入内核的。 linux的文件I/O是由操作系统提供的基本IO服务, 标准I/O库通过封装系统调用,提供了一个到底层I/O的接口。 标准I/O默认采用了缓冲机制,还创建了一个包含文件和缓冲区相关数据的数据结构;文件I/O一般没有采用缓冲模式,需要自己创建缓冲区。一种是标准库封装系统调用而成,更高级 ,一种是系统提供的,比较低级;标准I/O可移植性高、文件I/O可移植性低。 10、如何学习《Linux系统编程》这门课程,谈谈自己的感受。 第二 程序设计题目
要求: Shell程序设计部分、文件和目录部分、进程和信号部分、网络编程部分则必做(其中前3部分选作5道题目,网络编程为自学部分,选作2道题目)。 若做综合设计题目或自拟综合设计题目,则Shell程序设计部分、文件和目录部分、进程和信号部分、网络编程部分可不做。
Shell程序设计部分 1、设计shell脚本程序,运行结果如下: - - - - - - - - - - - - - - - - Linux 13/06/11 - - - - - - - - - - - - - - - - A: 查看进程信息 B:查看用户信息 C:显示当前目录信息 D:退出 - - - - - - - - - - - - - - - 当用户输入相应的数字执行相应的功能。 2、设计shell脚本程序,在屏幕上输出操作系统的信息,包括计算机名、Linux分发版本名称、Linux内核版本和当前的IP地址。 3、设计shell脚本程序,要求用户对/home目录下的文件进行备份,压缩为Linux系统中常用的tar.gz格式。 4、设计shell脚本程序,假设用户建立了目录A和目录B,目录中不包含子目录,要求用户编写一个脚本程序,比较两个目录内文件的差异。 5、设计一个shell程序,添加一个新组为class1,然后添加属于这个组的30个用户,用户名的形式为stdxx,其中xx从01到30。 6、设计一个shell程序计算n的阶乘。要求: (1)从命令行接收参数n; (2)在程序开始后立即判断n的合法性,即是否有参数,若有是否为正整数,若非法请给错误提示; (3)最后输出计算的结果。 7、设计一个shell程序,在每月第一天备 份并压缩/etc目录的所有内容,存放在/root/bak目录里,且文件名为如下形式yymmdd_etc,yy为年,mm为月,dd为日。 8、判断当前工作目录下所有的文件类型,如果是目录显示目录名,如果是文件查看文件内容,如果都不是,显示提示信息。 文件和目录部分 1、编写程序,打开一个文本文件 (1)读取其中内容,将其复制到一个新建文件中; (2)将文本文件截断至原来长度的1/2; (3)将文件中的小写字母转换成为大写字母 ,其他字符不变。 2、编写程序,读取当前目录下的内容,并将其打印输出到终端。