linux实验指导书.doc_第1页
linux实验指导书.doc_第2页
linux实验指导书.doc_第3页
linux实验指导书.doc_第4页
linux实验指导书.doc_第5页
已阅读5页,还剩18页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

Linux实验指导书 Linux程序设计实验指导书实验指导书计算机应用系xx年11月实验一Linux常用命令及编程环境1.实验相关知识简述Unix/Linux环境下使用C语言程序开发的项目主要经历设计、开发、调试、集成、部署和维护几个阶段。 目前典型的开发环境,主要使用vi、emacs、gedit等文字工具完成源代码的工作;通过指定不同的GCC编译器编译选项指定编译结果,根据编译器提示改正程序中的语法错误,最终生成符合目标要求的可执行二进制文件;当可执行文件执行结果与预期结果不一致时,使用GDB调试器跟踪程序执行过程,查看中间变量,改正源程序中存在的逻辑错误。 在大型项目管理中,由于文件较多,整个编译过程费时较长,安装、调试难度较大。 为解决手工管理效率低下的问题,引入Make工具,将项目编译、安装、维护等工作以脚本的形式组织在Makefile中,从而简化项目维护成本。 手工编写Makefile脚本难度较大且不利于统一规范,推荐使用Autotools工具集直接生成。 本实验仅设置手工、编译Linux C源代码,生成可执行文件并调试。 GNU CC(简称为GCC)是GNU项目中符合ANSI C标准的编译系统,能够编译用C、C+和Object C等语言编写的源程序。 GCC也可理解为一个工具集合,包含多个编译相关工具,如g编译C语言源程序,g+编译C+语言源程序,ld链接器等。 在编译C语言程序时,可直接使用g指令通过配置不同的参数选项达到指定GCC工具集的目的。 GCC的常用选项如表1.1所示表1.1GCC常用选项功能选项描述与编译相关的GCC选项-c只是编译不链接,生成目标文件“.o”-S只是编译不汇编,生成汇编代码-E只进行预编译,不做其他处理-g在可执行程序中包含标准调试信息-o file把输出文件输出到file里-v打印出编译器内部编译各过程的命令行信息和编译器的版本-I dir在头文件的搜索路径列表中添加dir目录-L dir在库文件的搜索路径列表中添加dir目录-static链接静态库-llibrary连接名为library的库文件报警与出错相关的-ansi支持符合ANSI标准的C程序-pedantic允许发出ANSI C标准所列的全部警告信息GCC选项-pedantic-error允许发出ANSI C标准所列的全部错误信息-w关闭所有告警-Wall允许发出G提供的所有有用的报警信息-werror把所有的告警信息转化为错误信息,并在告警发生时终止编译过程与体系结构相关的GCC选项-mcpu=type针对不同的CPU使用相应的CPU指令。 可选择的type有i 386、i 486、pentium及i686等-mieee-fp使用IEEE标准进行浮点数的比较-mno-ieee-fp不使用IEEE标准进行浮点数的比较-msoft-float输出包含浮点库调用的目标代码-mshort把int类型作为16位处理,相当于short int-mrtd强行将函数参数个数固定的函数用ret NUM返回,节省调用函数的一条指令使用GCC注意事项1)GCC指令的一般格式为G选项需编译的文件选项目标文件,其中,目标文件可缺省,GCC默认生成可执行的文件名为a.out。 执行时时使用指令./a.out;2)在include语句中,“”表示在标准路径中搜索头文件,“”表示在当前目录中搜索。 故代码中使用“#include”,就需要添加GCC编译选项“-I”指定myhead.h所在路径;3)选项“-L dir”的功能与“-I dir”类似,在编译时指定所需库文件路径,-l指定相应的库名称。 Linux下的库文件命名时规定必须以lib字母组合开头,后接库名称。 因此用-l选项指定链接库名为libsunq.so,在命令中选项写为-lsunq;GDB调试相关命令汇总如表1.2所示表1.2GDB相关命令汇总功能命令描述单步执行与函数跟踪backtrace(或bt)查看各级函数调用及参数finish执行到当前函数返回,然后停下来等待命令frame(或f)帧编号选择栈帧info(或i)locals查看当前栈帧局部变量的值list(或l)列出源代码,接着上次的位置往下列,每次列10行list行号列出从第几行开始的源代码list函数名列出某个函数的源代码next(或n)执行下一行语句print(或p)打印表达式的值,通过表达式可以修改变量的值或者调用函数set var修改变量的值start开始执行程序,停在main函数第一行语句前面等待命令step(或s)执行下一行语句,如果有函数调用则进入到函数中断点break(或b)行号在某一行设置断点break函数名在某个函数开头设置断点break.if.设置条件断点continue(或c)从当前位置开始连续而非单步执行程序delete breakpoints删除断点display变量名跟踪查看一个变量,每次停下来都显示它的值disable breakpoints禁用断点enable breakpoints启用断点info(或i)breakpoints查看当前设置了哪些断点run(或r)从头开始连续而非单步执行程序undisplay取消对先前设置的那些变量的跟踪观察点watch设置观察点info(或i)watchpoints查看当前设置了哪些观察点x从某个位置开始打印存储器的一段内容,全部当成字节来看,而不区分哪些字节属于哪些变量GDB使用注意事项1)在G编译选项中一定要加入“-g”;2)只有在代码处于“运行”或“暂停”状态时才能查看变量值;3)设置断点后程序在指定行之前停止;2.实验目的1)掌握Linux C开发过程中的基本概念;2)掌握如GCC,GDB等开发工具的使用;3.实验内容将参考代码录入到greet.c文件中,编译执行后发现结果与预期不一致,请使用GDB调试,完成字符串反序输出功能;4.参考代码5.实验扩展思考1)如何使用GCC将一组功能相关的源文件编译成相应库文件(静态库或动态库自行选择),并使用代码形式演示如何使用编译好的库?2)分析以下代码,完成指定范围内数值累加功能#includeint add_range(int low,int high)int i,sum;for(i=low;i0,向后0,向前whence偏移时的基点SEEK_SET:文件开头SEEK_CUR:文件读或写的当前位置SEEK_END:文件结束位置函数返回值成功偏移量;失败-1文件关闭close系统调用将通知内核实现内存与文件存储设备实现数据同步,并释放与此文件描述符相关的数据结构。 表2.5close语法要点头文件#include函数原型int close(int fd)参数说明fd需关闭的文件描述符函数返回值成功返回0失败-12.实验目的1)掌握Linux中系统调用、文件描述符的基本概念;2)掌握文件I/O的基本系统调用,如open,read,write,lseek,close等;3.实验内容将源文件中最后10KB字节拷贝到目标文件中;4.参考代码5.实验扩展思考1)文件进行拷贝操作时,程序设置缓冲大小对文件读写效率有何影响?如何确定缓冲大小?请使用代码验证?2)文件定位时偏移量出现以下异常情况,如文件大小为50KB,当前读写位置于25KB时,若向前或向后偏移30KB时,lseek如何处理?3)目前网络环境下载文件常使用多线程下载工具,若使用实验中涉及文件I/O,请使用伪代码简要说明设计思路?实验三文件属性及目录操作1.实验相关知识简述Linux平台上将目录当作一种特殊的文件进行处理,目录文件以记录的形式存储子目录或文件的i节点及对应的文件名。 为方便实现类UNIX操作系统间的程序移植,提供目录文件操作函数,如opendir,readdir,seekdir和closedir等。 目录文件记录以数据结构struct dirent保存,其结构体定义如表3.1所示。 i节点的主要作用是记录文件属性及其数据存储于文件系统中的位置,其结构体定义如表3.2所示。 表3.1目录相关操作的核心数据结构:struct dirent头文件#include功能dirent结构体代表目录文件中的目录项数据结构struct direntino_t d_ino;/*inode number*/off_t d_off;/*offset tothe nextdirent*/unsigned shortd_reclen;/*length ofthis record*/unsigned char d_type;/*type offile;not supportedby allfile systemtypes*/chard_name256;/*filename*/;表3.2文件属性核心数据结构struct stat头文件#include功能stat结构体代表文件的属性集合数据结构struct statdev_t st_dev;/*ID ofdevice containingfile*/ino_t st_ino;/*inode number*/mode_t st_mode;/*protection*/nlink_t st_nlink;/*number ofhard links*/uid_t st_uid;/*user IDof owner*/gid_t st_gid;/*group IDof owner*/dev_t st_rdev;/*device ID(if specialfile)*/off_t st_size;/*total size,in bytes*/blksize_t st_blksize;/*blocksize forfile systemI/O*/blkt_t st_blocks;/*number of512B blocksallocated*/time_t st_atime;/*time oflast aess*/time_t st_mtime;/*time oflast modification*/time_t st_ctime;/*time oflast statuschange*/;本实验中涉及关键函数及语法如下所示表3.3目录操作函数语法要点头文件#include#include函数原型打开目录文件DIR opendir(const char*dirname)返回目录中的当前目录项struct dirent*readdir(DIR*dirp)关闭目录文件int closedir(DIR*dirp);参数说明dirname目录文件路径dirp目录文件指针函数返回值opendir返回值非空代表打开目录成功,返回目录流指针(DIR*);当返回为NULL表示目录打开失败,errno重置,失败主要原因如下EACCES Permissiondenied.EBADF fdis nota validfile descriptoropened forreading.EMFILE Toomany filedescriptors inuse byprocess.ENFILE Toomany filesare currentlyopen inthe system.ENOENT Directorydoes notexist,or nameis anempty string.ENOMEM Insufficientmemory toplete theoperation.ENOTDIR nameis nota directory.readdir成功时返回指向目录项(struct dirent)指针,返回NULL表示已读取到目录流结尾closedir执行成功,返回0;失败-1表3.4stat操作要点头文件#include功能获取文件属性函数原型int stat(char*fname,struct stat*bufp);参数说明fname文件名bufp指向stat结构体的指针函数返回值成功返回0;失败-1在头文件中,通过掩码定义实现POSIX支持的若干种文件类型判断,其判断基础为struct stat中st_mode成员(如图3.1所示)图3.1文件类型及许可权限对应文件类型判定宏为如下所示S_ISREG(m)is ita regularfile?S_ISDIR(m)directory?S_ISCHR(m)character device?S_ISBLK(m)block device?S_ISFIFO(m)FIFO(named pipe)?S_ISLNK(m)symbolic link?(Not inPOSIX.1-1996.)S_ISSOCK(m)socket?(Not inPOSIX.1-1996.)2.实验目的1)理解Linux中的目录及i节点等基本概念;2)掌握目录的读写时常用的函数,如opendir,readdir,closedir等;3)掌握文件属性的读取方法,如stat;4)掌握掩码技术,可实现对比特位操作;3.实验内容可识别用户输入路径对应文件的类型,若为目录则读取相应子目录及文件名;若为文件,则读取其i节点号和文件大小属性;u gs r w x rw xrwxtype usergroup othersuid sgidsticky4.参考代码5.实验扩展思考1)目录在Linux平台被认为是一种文件类型,能否使用文件I/O系统调用,如open,read,write,close进行目录操作?如果能,为何还提供诸如opendir等函数定义,这些实现有何意义?2)在本实验的基础之上进行改进,要求递归打印指定目录下所有子目录的文件名?3)总结掩码实现比特位操作时,置位操作和清零操作的具体实现表达式?实验四进程控制1.实验相关知识简述进程代表一个程序的一次执行过程,是一个动态的概念,涉及程序运行时执行状态和所使用的资源的管理。 在进程控制中,进程主要以三种状态出现就绪、执行和阻塞,其转换关系如4.1所示。 图4.1进程状态转换Linux系统将进程的执行划分为用户模式和内核模式。 当用户执行应用程序或内核以外的其它程序时,进程运行在用户空间;反之,则运行在内核空间。 当用户进程需要内核提供功能支持时,可通过中断或系统调用进入内核空间。 在Linux下进程的结构如图4.2所示图4.2Linux进程映像示意图本实验中涉及关键函数及语法如下所示表4.1fork语法要点头文件#include函数原型pid_t fork(void)功能创建进程函数返回值fork返回值有三种情况 (1)创建新进程失败,返回-1; (2)父进程返回新建子进程标识符(pid) (3)子进程返回0表4.2exec函数族语法要点头文件#include函数原型int execl(const char*path,const char*arg,);int execv(const char*path,char*const argv);int execle(const char*path,const char*arg,char*const envp);int execve(const char*path,char*const argv,char*const envp);(*)int execlp(const char*file,const char*arg,);int execvp(const char*file,char*const argv);功能在指定路径中查找并执行文件参数说明path/file执行文件对应的路径或文件名arg/argv执行文件所用参数,分别使用列表或向量形式组织envp执行文件所用环境变量函数返回值exec返回值返回-1表明查找并执行对应文件失败;exec函数族小结exec函数族前4个字符串一定为exec;第5个字符可为l或v,分别代表列表(list)和向量(vector)。 列表以可变参数的形式出现,最后一项为NULL;向量以数组的形式出现,对应的字符串数组最后一项为NULL,表明数组结束;第6个字符可为e或p,为e表明指定进程执行时的环境变量,为p则说明查找文件名而不是路径。 表4.3wait语法要点头文件#include#include功能阻塞进程,等待进程结束函数原型pid_t wait(int*statusptr);参数说明statusptr子进程的运行结果函数返回值wait返回值有二种情况4)阻塞当前进程,执行失败,返回-1;5)阻塞当前进程,当某子进程结束返回该子进程id,取消阻塞相关函数watipid (2),wait3 (2)表4.4exit语法要点头文件#include功能终止当前进程函数原型void exit(int status)参数说明status进程终止状态函数返回值无相关函数_exit (2),atexit (3),on_exit (3)2.实验目的1)深入理解进程控制相关概念;2)掌握守护进程及Linux进程之间的关系;3)掌握进程控制时常用的函数,如fork,wait,exec,exit等;3.实验内容某进程创建一子进程,子进程运行“ls-l”指令。 要求父进程先以阻塞方式等待子进程结束,当该子进程正常退出后,父进程再创建新的子进程,反复打印“child2process isactive!”;此时结束父进程,并观察子进程的运行情况;4.参考代码5.实验扩展思考1)父进程在创建子进程后结束,子进程将由init进程托管,称之为守护进程。 请分析实验代码,指出那个进程可称为守护进程?2)用户使用Ctrl+C信号可实现终止程序,在本实验中为何无法实现终止子进程2,请分析原因,并说明此类应用的合理场景?3)请查阅man手册,实现以下场景父进程创建多个子进程,阻塞自身至指定子进程结束?实验五进程间通信1.实验相关知识简述进程拥有独立的运行空间,彼此隔离。 但实际开发过程中,常常需要两个或多个进程间进程数据通信,UNIX/Linux提供相应的技术手段,习惯上称之为IPC(Inter-Processing Communication)。 Linux IPC技术四个方面传统UNIX的进程间通信、System V进程间通信、POSIX进程间通信和Socket通信。 (1)UNIX IPC主要提供管道、命名管道(FIFO)和信号; (2)System VIPC主要提供System V消息队列、System V信号量和System V共享内存; (3)POSIX IPC主要提供POSIX消息队列、POSIX信号量和POSIX共享内存;常用的IPC技术特点如下1)管道(Pipe)存在于内核,父子进程间无格式字节通信2)命名管道(FIFO)类似管道,存在文件系统中,任意进程间通信3)信号(Signal)软件模拟中断机制,多用于事件处理4)消息队列(Messge Queue)按键值随机访问,消息追加到队列的尾部5)共享内存(Shared memory)若干进程将一块物理内存映射到进程自身空间中,用于数据读写,多与同步机制(互斥锁或信号量)结合使用6)信号量(Semaphore)进程或线程针对临界资源访问的同步或互斥实现7)套接字(Socket)网络中位于不同机器的进程之间的通信本实验中涉及关键函数及语法如下所示表5.1pipe语法要点头文件#include函数原型int pipe(int array2)功能创建管道参数说明array文件描述符数组,其中array0只读,array1只写函数返回值若创建管道失败,返回-1;创建成功,返回0特别注意1)系统调用fork之前必须先调用pipe,否则子进程将不会继承父进程提供的文件描述符;2)读一个写端已关闭的管道时,在所有数据被读取后,read返回0表示达到文件结束处;3)写一个读端已关闭的管道时,产生信号SIGPIPE。 若忽略或捕捉该信号并从处理程序中返回时,write出错返回,errno设置为EPIPE;4)父子进程并发运行,需同步机制保证读写次序;5)管道不可定位(lseek);2.实验目的1)理解POSIX和System V提供的IPC相关概念;2)理解管道所使用的文件描述符数组如何实现父子进程间的通信;3)掌握IPC常用的函数,如pipe,mkfifo等;3.实验内容根据应用需要,父进程A需向子进程B传输消息“Message here”,请使用管道技术完成此功能;4.参考代码5.实验扩展思考1)若父进程A接收子进程B发送来的消息“Message here”,实验代码如何调整?2)若父进程A创建子进程B和C,A进程向管道写“Message here”,B或C进程读取后,另一个进程将无法再次读取,试用代码验证其正确性?3)请问常见的IPC通信手段,如命名管道、共享内存,信号量、消息通信等方法,那些可以完成实验要求内容,请选择一种加以实现?实验六流式套接字编程1.实验相关知识简述计算机网络是一个典型的复杂系统,为方便理解、实现及相关标准的执行,一般将计算机网络分而治之,提供分层模型,每层实现相应的功能,下层为上层提供相应服务。 目前最具影响力的分层模型是ISO/OSI模型和TCP/IP模型,前者划分清晰,分层合理,多应用于网络研究,后者则为目前网络实施的事实性标准。 ISO/OSI标准从下至上,依次为物理层、数据链路层、网络层、传输层、会话层、表示层和应用层,其每层功能具体表述如下1)物理层(PhysicalLayer),规定通信设备的机械的、电气的、功能的和过程的特性,用以建立、维护和拆除物理链路连接。 具体地讲,机械特性规定了网络连接时所需接插件的规格尺寸、引脚数量和排列情况等;电气特性规定了在物理连接上传输bit流时线路上信号电平的大小、阻抗匹配、传输速率距离限制等;功能特性是指对各个信号先分配确切的信号含义,即定义了DTE和DCE之间各个线路的功能;规程特性定义了利用信号线进行bit流传输的一组操作规程,是指在物理连接的建立、维护、交换信息是,DTE和DCE双放在各电路上的动作系列。 此层数据的单位称为比特(bit)。 属于物理层定义的典型规范代表包括EIA/TIA RS- 232、EIA/TIA RS- 449、V. 35、RJ-45等。 2)数据链路层(DataLinkLayer):在物理层提供比特流服务的基础上,建立相邻结点之间的数据链路,通过差错控制提供数据帧(Frame)在信道上无差错的传输,并进行各电路上的动作系列。 数据链路层在不可靠的物理介质上提供可靠的传输。 该层的作用包括物理地址寻址、数据的成帧、流量控制、数据的检错、重发等。 此层,数据的单位称为帧(frame)。 数据链路层协议的代表包括SDLC、HDLC、PPP、STP、帧中继等。 3)是网络层(Network layer)在计算机网络中进行通信的两个计算机之间可能会经过很多个数据链路,也可能还要经过很多通信子网。 网络层的任务就是选择合适的网间路由和交换结点,确保数据及时传送。 网络层将数据链路层提供的帧组成数据包,包中封装有网络层包头,其中含有逻辑地址信息-源站点和目的站点地址的网络地址。 如果你在谈论一个IP地址,那么你是在处理第3层的问题,这是“数据包”问题,而不是第2层的“帧”。 IP是第3层问题的一部分,此外还有一些路由协议和地址解析协议(ARP)。 有关路由的一切事情都在第3层处理。 地址解析和路由是3层的重要目的。 网络层还可以实现拥塞控制、网际互连等功能。 此层,数据的单位称为数据包(packet)。 网络层协议的代表包括IP、IPX、RIP、OSPF等。 4)传输层(Transport layer)此层的数据单元也称作数据包(packets)。 但是,当你谈论TCP等具体的协议时又有特殊的叫法,TCP的数据单元称为段(segments)而UDP协议的数据单元称为“数据报(datagrams)”。 这个层负责获取全部信息,因此,它必须跟踪数据单元碎片、乱序到达的数据包和其它在传输过程中可能发生的危险。 第4层为上层提供端到端(最终用户到最终用户)的透明的、可靠的数据传输服务。 所为透明的传输是指在通信过程中传输层对上层屏蔽了通信传输系统的具体细节。 传输层协议的代表包括TCP、UDP、SPX等。 5)会话层(Session layer)在会话层及以上的高层次中,数据传送的单位不再另外命名,统称为报文。 会话层不参与具体的传输,它提供包括访问验证和会话管理在内的建立和维护应用之间通信的机制。 如服务器验证用户登录便是由会话层完成的。 6)表示层(Presentation layer)此层主要解决用户信息的语法表示问题。 它将欲交换的数据从适合于某一用户的抽象语法,转换为适合于OSI系统内部使用的传送语法。 即提供格式化的表示和转换数据服务。 数据的压缩和解压缩,加密和解密等工作都由表示层负责。 7)应用层(Application layer),应用层为操作系统或网络应用程序提供访问网络服务的接口。 应用层协议的代表包括Tel、FTP、SNMP等。 OSI模型对层次划分合理,但由于层次划分过多,不利于实现。 TCP/IP模型在此基础之上,对相应层次进行合并,图6.1为OSI模型和TCP/IP模型的对应关系。 图6.1OSI与TCP/IP模型的对应关系计算机操作系统多数提供针对网络部分的支持,支持TCP/IP模型。 实际编程中,多使用SOCKET相关系统调用,配置不同的参数属性,完成SOCKET定制。 如图6.2所示为使用TCP协议进行在服务器与客户端之间进行流式数据通信的基本过程。 图6.2流式套接字通信基本过程本实验中涉及关键函数及语法如下所示表6.1socket语法要点头文件#include#include函数原型int socket(int domain,int type,int protocol)功能创建一个socket参数说明domain通信域8)AF_UNIXUNIX内部(文件系统套接字)9)AF_INETARPA因特网协议(UNIX网络套接字)10)AF_ISOISO标准协议11)AF_NS施乐网络系统协议12)AF_IPXNovell IPX协议13)AF_APPLETALKAppletalkDDS typesocket类型,常用宏 (4)SOCK_STREAM流式套接字,默认使用TCP (5)SOCK_DGRAM数据报套接字,默认使用UCP (6)SOCK_RAW原始套接字protocolsocket使用协议,使用默认协议值为0函数返回值若创建socket失败,返回-1;创建成功,返回socket id表6.2bind语法要点头文件#include#include函数原型int bind(int sockid,struct sockaddr*addrp,socklen_t addrlen)功能为socket指定

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论