linux试卷(自解答版本)

上传人:努力****83 文档编号:161298527 上传时间:2022-10-13 格式:DOCX 页数:7 大小:45.66KB
返回 下载 相关 举报
linux试卷(自解答版本)_第1页
第1页 / 共7页
linux试卷(自解答版本)_第2页
第2页 / 共7页
linux试卷(自解答版本)_第3页
第3页 / 共7页
点击查看更多>>
资源描述
一:填空(14)索引结点文件的管理信息(名字和一些属性),包括文件的创建/修改日期和它的访问权限,被保存在文件的inode中,它是文件系统中的一个特殊的数据块,它同时还包含文件的长度和文件在磁盘上的存放位置。系统使用的是文件的inode编号,目录结构为文件命名仅仅是为了便于使用。几个特殊信号P405SIGHUP连接挂断SIGINT终端中断SIGKILL终止进程(此信号不能被捕获或忽略)SIGQUIT终端退出SIGTERM终止SIGCHLD子进程已经停止或退出SIGCONT继续执行暂停进程SIGSTOP停止执行(此信号不能被捕获或忽略)SIGTSTP终端挂起I/O库函数的三种缓存全缓存、行缓存、不带缓存大多数UNIX系统都提供了_(填写某种机制,或系统调用函数),可以在不使用read/write的情况下执行I/O。(其实这道题在复习时我提到过的,但在批改试卷后发现答出来的同学很少。答案是mmap机制或存储映射I/O。请参看UNIX环境高级编程。第一版12.9节“存储映射I/O”(第二版我手头没有,请同学自己查阅)。存储映射I/O使一个磁盘文件与存储空间中的一个缓存相映射。于是当从缓存中取数据,就相当于读文件中的相应字节。与其类似,将数据存入缓存,则相应字节就自动地写入文件。这样,就可以在不使用read和write的情况下执行I/O。为了使用这种功能,应首先告诉内核将一个给定的文件映射到一个存储区域中。这是由mmap函数实现的。)二:简答(38)1 shell程序设计查看当前目录下的子目录并只显示子目录;1. ls -F | grep /$2. ls -l | grep “d”查找一个错误代码EPERM(宏定义)在Linux系统头文件中的定义并显示。grep EPERM *.h2编写两个简单的程序(fred.c, bill.c),将其编译为目标文件,并分别生成静态库和动态库。再编写程序调用之,说明库的使用。(1)生成静态链接库gcc -c h.c -o h.oar cqs libh.a h.o /ar是生成库的命令,cqs是参数,libh.a是生成的静态链接库须以lib开头,h是库名,a表示是静态链接库,h.o是刚才生成目标文件(2).生成动态链接库gcc -c h.c -o h.o生成动态链接库用gcc来完成gcc -shared -WI -o libh.so h.o/-shared -WI是参数,libh.so是生成的静态链接库须以lib开头,h是库名,so表示是动态链接库,h.o是刚才生成目标文件(3)将生成的libh.a,libh.so拷贝到/usr/lib或/lib下(4)编译带静态链接库的程序gcc -c test.c -o test.ogcc test.o -o test -WI -Bstatic -lh/-WI -Bstatic表示链接静态库,-lh中-l表示链接,h是库名即/usr/lib下的libh.a(5)编译带动态链接库的程序gcc -c test.c -o test.ogcc test.o -o test -WI -Bdynamic -lh/-WI -Bdynamic表示链接动态库,-lh中-l表示链接,h是库名即/usr/lib下的libh.so(6)运行./test得到结果3什么是shell内部命令;试举例说明,并说明该命令为什么是内部命令。bash命令解释套装程序包含了一些内部命令。内部命令在目录列表时是看不见的,它们由Shell本身提供。Bash的内部命令是很多的:alias,bg,fg,builtin,break,exit,let,kill,export,hash,jobs,set,umask,test,type,ulimit等等。可以man bash,然后搜索“SHELL BUILTIN COMMANDS”,之后的就一次介绍着很多很多的内部命令了。下面列列列举几个常用的内部命令吧:echo, eval, exec, export, readonly, read, shift, wait和source(.)。下面简单介绍其命令格式和功能。1echo命令格式:echo arg功能:在屏幕上显示出由arg指定的字串。2eval命令格式:eval args功能:当Shell程序执行到eval语句时,Shell读入参数args,并将它们组合成一个新的命令,然后执行。3exec命令格式:exec命令参数功能:当Shell执行到exec语句时,不会去创建新的子进程,而是转去执行指定的命令,当指定的命令执行完时,该进程(也就是最初的 Shell)就终止了,所以Shell程序中exec后面的语句将不再被执行。4export命令格式:export变量名 或:export变量名=变量值功能:Shell可以用export把它的变量向下带入子Shell,从而让子进程继承父进程中的环境变量。但子Shell不能用export把它 的变量向上带入父Shell。注意:不带任何变量名的export语句将显示出当前所有的export变量。5readonly命令格式:readonly变量名功能:将一个用户定义的Shell变量标识为不可变。不带任何参数的readonly命令将显示出所有只读的Shell变量。6read命令格式:read变量名表功能:从标准输入设备读入一行,分解成若干字,赋值给Shell程序内部定义的变量。7shift语句功能:shift语句按如下方式重新命名所有的位置参数变量,即$2成为$1,$3成为$2在程序中每使用一次shift语句,都使所有的位置参 数依次向左移动一个位置,并使位置参数$#减1,直到减到0为止。8wait功能:使Shell等待在后台启动的所有子进程结束。wait的返回值总是真。9exit功能:退出Shell程序。在exit之后可有选择地指定一个数位作为返回状态。10“.”(点)命令格式:. Shell程序文件名功能:使Shell读入指定的Shell程序文件并依次执行文件中的所有语句。4用户没有对/etc/passwd, /etc/shadow的写权限,为什么可以通过passwd命令修改口令。实际用户和有效用户passwd程序的有效用户是root,有权限修改权限5 open系统调用的四种模式分别有什么效果。P84O_RDONLY以只读方式打开O_WRONLY以只写方式打开O_RDWR以读写方式打开6以I/O为例,说明系统调用接口与库接口的异同。从程序完成的功能来看,函数库提供的函数通常是不需要操作系统的服务. 函数是在用户空间内执行的,除非函数涉及到I/O操作等,一般是不会切到核心态的。系统调用是要求操作系统为用户提供进程,提供某种服务,通常是涉及系统的硬件资源和一些敏感的软件资源等。函数库的函数,尤其与输入输出相关的函数,大多必须通过Linux的系统调用来完成。因此我们可以将函数库的函数当成应用程序设计人员与系统调用程序之间的一个中间层,通过这个中间层,我们可以用一致的接口来安全的调用系统调用。这样程序员可以只要写一次代码就能够在不同版本的linux系统间使用积压种具体实现完全不同的系统调用。至于如何实现对不同的系统调用的兼容性问题,那是函数库开发者所关心的问题。从程序执行效率来看,系统调用的执行效率大多要比函数高,尤其是处理输入输出的函数。当处理的数据量比较小时,函数库的函数执行效率可能比较好,因为函数库的作法是将要处理的数据先存入缓冲区内,等到缓冲区装满了,再将数据一次写入或者读出。这种方式处理小量数据时效率比较高,但是在进行系统调用时,因为用户进程从用户模式进入系统核心模式,中间涉及了许多额外的任务的切换工作,这些操作称为上下文切换,此类的额外工作会影响系统的执行效率。但是当要处理的数据量比较大时,例如当输入输出的数据量超过文件系统定义的尺寸时,利用系统调用可获得较高的效率。从程序的可移植性的角度来看,相对于系统调用,C语言的标准备函数库(ANSI C) 具备较高的可移植性,在不同的系统环境下,只要做很少的修改,通常情况是不需要修改的。 库函数是高层的,完全运行在用户空间, 为程序员提供调用真正的在幕后完成实际事务的系统调用的更方便的接口。系统调用在内核态运行并且由内核自己提供。标准C库函数printf()可以被看做是一个通用的输出语句,但它实际做的是将数据转化为符合格式的字符串并且调用系统调用write()输出这些字符串。函数库调用系统调用在所有的ANSI C编译器版本中,C库函数是相同的各个操作系统的系统调用是不同的它调用函数库中的一段程序(或函数)它调用系统内核的服务与用户程序相联系是操作系统的一个入口点在用户地址空间执行在内核地址空间执行它的运行时间属于“用户时间”它的运行时间属于“系统”时间属于过程调用,调用开销较小需要在用户空间和内核上下文环境间切换,开销较大在C函数库libc中有大约300个函数在UNIX中大约有90个系统调用典型的C函数库调用:system fprintf malloc典型的系统调用:chdir fork write brk;三:程序及理解(28)1创建一个包含两个进程的进程环,其中每一个进程的标准输出是另一个进程的标准输入(画图说明,可以用伪代码,但要写出关键的系统调用函数)。父进程创建两个pipe,然后fork,父子进程再关闭一些fd,就会产生一个环了pipe fork execlP449 P398 P3962一段简单的并发网络端程序,填空并说明作用;说出两种实现并发服务器的方式。P536并发服务器在15章套接字最后一节“多客户”有介绍四:思考与论述(20)1说明编写一个client_server程序可以使用哪些IPC机制(3种),并对其性能、效率、使用方法、易用性进行述评。书或PPT信号:信号机制是UNIX为进程中断处理而设置的。它只是一组预定义的值,因此不能用于信息交换,仅用于进程中断控制。例如在发生浮点错、非法内存访问、执行无 效指令、某些按键(如ctrl-c、del等)等都会产生一个信号,操作系统就会调用有关的系统调用或用户定义的处理过程来处理。-信号处理的系统调用是signal,调用形式是:-signal(signalno,action)-其中,signalno是规定信号编号的值,action指明当特定的信号发生时所执行的动作。管道:管道可用于具有亲缘关系进程间的通信,有名管道克服了管道没有名字的限制,因此,除具有管道所具有的功能外,它还允许无亲缘关系进程间的通信;管道机制在UNIX开发的早期就已经提供了,它在本机上的两个进程间的数据传递表现的相当出色;管道分为pipe(无名管道)和FIFO(命名管道),它们都是通过内核缓冲区按先进先出的方式数据传输,管道一端顺序地写入数据,另一端顺序地读入数据。读写的位置都是自动增加,数据只读一次,之后就被释放。在缓冲区写满时,则由相应的规则控制读写进程进入等待队列,当空的缓冲区有写入数据或满的缓冲区有数据读出时,就唤醒等待队列中的写进程继续读写。管道的主要局限性正体现在它的特点上:只支持单向数据流;只能用于具有亲缘关系的进程之间;没有名字;管道的缓冲区是有限的(管道制存在于内存中,在管道创建时,为缓冲区分配一个页面大小);管道所传送的是无格式字节流,这就要求管道的读出方和写入方必须事先约定好数据的格式,比如多少字节算作一个消息(或命令、或记录)等等。无名管道实际上是内存中的一个临时存储区,它由系统安全控制,并且独立于创建它的进程的内存区。管道对数据采用先进先出方式管理,并严格按顺序操作,例如不能对管道进行搜索,管道中的信息只能读一次。-无名管道只能用于两个相互协作的进程之间的通信,并且访问无名管道的进程必须有共同的祖先。-系统提供了许多标准管道库函数,如:pipe()打开一个可以读写的管道;close()关闭相应的管道;read()从管道中读取字符;write()向管道中写入字符;-有名管道的操作和无名管道类似,不同的地方在于使用有名管道的进程不需要具有共同的祖先,其它进程,只要知道该管道的名字,就可以访问它。管道非常适合进程之间快速交换信息。信号量:主要作为进程间以及同一进程不同线程之间的同步手段在UNIX中,信号灯是一组进程共享的数据结构,当几个进程竞争同一资源时(文件、共享内存或消息队列等),它们的操作便由信号灯来同步,以防止互相干扰。-信号灯保证了某一时刻只有一个进程访问某一临界资源,所有请求该资源的其它进程都将被挂起,一旦该资源得到释放,系统才允许其它进程访问该资源。信号灯通常配对使用,以便实现资源的加锁和解锁。-进程间通信的实现技术的特点是:操作系统提供实现机制和编程接口,由用户在程序中实现,保证进程间可以进行快速的信息交换和大量数据的共享。但是,上述方式主要适合在同一台计算机系统内部的进程之间的通信。共享内存:使得多个进程可以访问同一块内存空间,是最快的可用IPC形式。是针对其他通信机制运行效率较低而设计的。往往与其它通信机制,如信号量结合使用,来达到进程间的同步及互斥。共享存储段是主存的一部分,它由一个或多个独立的进程共享。各进程的数据段与共享存储段相关联,对每个进程来说,共享存储段有不同的虚拟地址。系统提供的有关SM的系统调用有:-int shmget(key,size,flag)创建大小为size的SM段,其相应的数据结构名为key,并返回共享内存区的标识符shmid;-char shmat(shmid,address,flag)将当前进程数据段的地址赋给shmget所返回的名为shmid的SM段;-int shmdr(address)从进程地址空间删除SM段;-int shmctl (shmid,cmd,buf)对SM的控制操作;-SM的大小只受主存限制,SM段的访问及进程间的信息交换可以通过同步读写来完成。同步通常由信号灯来实现。SM非常适合进程之间大量数据的共享。消息队列:消息队列是消息的链接表,包括Posix消息队列system V消息队列。有足够权限的进程可以向队列中添加消息,被赋予读权限的进程则可以读走队列中的消息。消息队列克服了信号承载信息量少,管道只能承载无格式字节流以及缓冲区大小受限等缺点消息队列是内存中独立于生成它的进程的一段存储区,一旦创建消息队列,任何进程,只要具有正确的的访问权限,都可以访问消息队列,消息队列非常适合于在进程间交换短信息。-消息队列的每条消息由类型编号来分类,这样接收进程可以选择读取特定的消息类型这一点与管道不同。消息队列在创建后将一直存在,直到使用msgctl系统调用或iqcrm -q命令删除它为止。-系统提供了许多有关创建、使用和管理消息队列的系统调用,如:-int msgget(key,flag)创建一个具有flag权限的MQ及其相应的结构,并返回一个唯一的正整数msqid(MQ的标识符);-int msgsnd(msqid,msgp,msgsz,msgtyp,flag)向队列中发送信息;-int msgrcv(msqid,cmd,buf)从队列中接收信息;-int msgctl(msqid,cmd,buf)对MQ的控制操作;套接字:更为一般的进程间通信机制,可用于不同机器之间的进程间通信。起初是由Unix系统的BSD分支开发出来的,但现在一般可以移植到其它类Unix系统上:Linux和System V的变种都支持套接字。2说明shell中管道的实现机制(可以用伪代码,但要写出关键的系统调用函数)pipe管道机制和dup系统调用, forkCH4 P81 P84
展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 图纸专区 > 大学资料


copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!