linu复习.docx
- 文档编号:3829614
- 上传时间:2022-11-25
- 格式:DOCX
- 页数:39
- 大小:1.02MB
linu复习.docx
《linu复习.docx》由会员分享,可在线阅读,更多相关《linu复习.docx(39页珍藏版)》请在冰豆网上搜索。
linu复习
二linux基础命令
1、创建用户,以自己的姓名缩写创建用户名,并设置密码;
useraddmingzi
passwdmingzi敲回车输入密码;
2、显示当前系统进程列表;结束gnome-screensaver并显示效果;
LL显示当前文件,LS-L一行输出一个文件;
kill-9+进程号杀死一个进程;
3、查看磁盘分区情况;
fdisk-l;
4、切换当前用户为David并携带环境变量,并查看当前目录和文件信息;
su-David切换用户,并携带环境变量。
pwd查看当前目录;
ll查看文件信息
5、在David目录下创建多级目录hello/my,并查看当前目录路径;
mkdir-p./hello/my创建多级目录;
6、在my目录下继续创建子目录why,设置目录访问权限777;
mkdir-m777./why
7、使用cat将键盘输入的字符传到单个文件abc中,依此方法创建另一个文件def;将abc的内容覆盖def;将abc的内容追加到def;将def的内容显示在shell中;将def的内容按行号显示;将def的内容逆序显示;
cat>abc回车123456ctrl+z创建文件abc并向里面输入123456内容;
moreabc查看文件里面的内容;
catabc>def用abc里面的内容覆盖def里面的内容;
catabc>>def将abc里面的内容追加到def中;
cat cat-ndef带行号的显示def里面的内容; tacdef逆序显示; 8、将def文件拷贝到上级目录;并重命名为d;将d文件剪切回my目录;将my目录拷贝到hello目录中;将hello目录中拷贝的my目录强制删除; cpdef../将def文件复制到上一级目录;mvdefd重命名为d; mv-i./home/David/hello/d/home/David/hello/my移动,剪回; cp-rf复制;rm-rfmy删除; 9、将abc的文件所有者和用户组都改为自己姓名对应的组名;将abc的文件所有者权限设置为r--,其他权限设置为r-wr--; chownxingmingabc修改文件所有者和组名 chgrpxingmingabc改变文件的组所有权 chmod464abc第一位是创建者,第二位是同组,第三位是其他组 (见书上28页) 10、使用grep和管道只显示gnome-terminal进程; 11、在/在使用find按照文件名查找abc文件;使用locate快速查找abc文件; find-nameabc locateabc 12、将abc文件压缩,然后解压; tar-zcvfabc.tar.gzabc压缩 tar-zxvfabc.tar.gzabc压缩 13、将David目录进行打包;然后解压linux-2.6.18-tar.bz2文件(在第2章页面中可下载)如果解压*.tar.gz用什么命令; tar-jcvflinux-2.6.18-tar.bz2linux压缩 tar-jxvflinux-2.6.18-tar.bz2linux解压 回答问题: 1、解释X-window是什么? X-window是一个图形化得显示界面,在linux里面以一个图形化显示软件存在。 2、普通用户和超级用户区别何在? 普通用户与超级用户的区别在对文件的操作权限上,超级用户可以给普通用户开通相应的操作权限,如果超级用户不给普通用户相应的权限,普通用户则无法执行相应功能。 3、解释chmod命令的作用,并说明目录访问权限776是什么意思? chmod是更改拥有者对文件的执行权限的命令,7的意思是r+w+x=7,其中r=4,w=2,x=1,776代表着,拥有者及拥有者所在的小组内成员对问价拥有读写执行的权限,而小组外的成员对文件仅能进行读写,不能进习执行权限。 4、解释ln的作用以及包括的类型; 它的功能是为某一个文件在另外一个位置建立一个同步的链接.当我们需要在不同的目录,用到相同的文件时,我们不需要在每一个需要的目录下都放一个必须相同的文件,我们只要在某个固定的目录,放上该文件,然后在其它的目录下用ln命令链接它就可以,不必重复的占用磁盘空间 5、解释什么是用户登录模式; 用户登录模式是root账户下的子账户登录,往往我们用root账户来修改系统,用用户账户来使用系统,即root拥有无限大的权利,可以杀死自己,而用户账户则可以在一定约束下使用系统。 6、解释如何修改系统服务自启动的级别? 如果需要自启动某些服务,只需使用chkconfig服务名on即可,若想关闭,将on改为off在默认情况下,chkconfig会自启动2345这四个级别,如果想自定义可以加上--level选项我们先将sshd服务的所有启动级别关闭,然后使用--level选项启动自定义级别。 第三章 1.vi (1)在“/root”目录下建一个名为“vi”的目录。 (2)进入“vi”目录。 (3)将文件“/etc/inittab”复制到“vi”目录下。 (4)使用vi打开“vi”目录下的inittab。 viinittab; (5)设定行号,指出设定initdefault(类似于“id: 5: initdefault”的所在行号。 ) 在特权模式下输入: setnu;setnonu,取消行号; /initdefault在光标之后查找名为initdefault的字符串; ? initdefault在光标之前。 (在第十八行找到字符串) (6)将光标移到该行。 18G光标移动到十八行 (7)复制该行内容。 插入模式下1yyoesc模式下p粘贴 nyy复制光标所在行的向下的n行; (8)将光标移到最后一行行首。 ESC直接输入G最后一行行首 ESC直接输入gg移动到文件开头 (9)粘贴复制行的内容。 (10)撤消第9步的动作。 ESC(u恢复前一个动作) (11)将光标移动到最后一行的行尾。 特权模式下使用G $光标所在行的尾部; (13)光标移到“si: : sysinit: /etc/rc.d/rc.sysinit 行号G (14)删除该行。 (dd) (15)存盘但不退出。 : w (16)将光标移到首行。 gg (19)向下查找字符串“0: wait”。 (/0: wait) (20)再向上查找字符串“halt”。 (? halt) (21)强制退出vi,不存盘: q! 2.用gdb调试程序的Bug (1)在工作目录上新建文件greet.c,并用vi启动: vigreet.c。 (2)在vi中输入以上代码。 (3)在vi中保存并退出,使用命令“: wq”。 (4)用gcc编译: gcc-ggreet.c-ogreet。 (5)运行greet,使用命令“./greet”输出为: TheoriginalstringisEmbeddedLinux Thestringafterwardis (6)启动gdb调试: gdbgreet。 (7)查看源代码,使用命令“l”。 (8)在20行(for循环处)设置断点,使用命令“b20”。 (10)查看断点设置情况,使用命令“infob”。 (11)运行代码,使用命令“r”。 (运行到了第一个断点处) (12)单步运行代码,使用命令“n”。 (运行完一次for循环) s进入函数体单步运行 (13)查看暂停点变量值,使用命令pstring2[size-i]有可能是ASCII值 (15)继续程序的运行,使用命令“c”。 (16)程序在printf前停止运行,此时依次查看string2[0]、string2[1]…,发现string[0]没有被正确赋值,而后面的赋值都是正确的,这时,定位程序第31行,发现程序运行结果错误的原因在于“size-1”于i只能增到“size-1”这样string2[0]就永远不能被赋值而保持NULL,故不能输出任何结果。 (17)退出gdb,使用命令“q”。 (18)重新编辑greet.c,把其中的“string2[size-i]=string1[i]”改为“string2[size–i-1]=string1[i];”即可。 (19)使用gcc重新编译: gcc-ggreet.c-ogreet。 (20)查看运行结果: ./greet TheoriginalstringisEmbeddedLinux ThestringafterwardisxuniLdeddedbmE 这时,输出结果正确。 3.编写包含多文件的makefile (1)用vi打开上述两个代码文件“hello.c”和“hello.h”。 (2)在shell命令行中用gcc尝试编译,使用命令: "gcchello.c–ohello”并运行,./hello可执行文件查看结果。 (3)删除此次编译的可执行文件: rmhello。 (4)用vi编辑makefile,如下所示: hello: hello.chello.h (一定是一个制表位的空档)gcchello.c-ohello (5)退出保存,在shell中键入: make,查看结果。 (6)再次用vi打开makefile,用变量进行替换,如下所示: OBJS: =hello.o CC: =gcc hello: $(OBJS) $(CC)$^-o$@ (7)退出保存,在shell中键入make,查看结果。 (8)用vi编辑makefile1,如下所示: hello: hello.o gcchello.o-ohello hello.o: hello.chello.h gcc-chello.c-ohello.o (9)退出保存,在shell中键入: make-fmakefile1,查看结果。 (10)再次用vi编辑makefile1,如下所示: OBJS1: =hello.o OBJS2: =hello.chello.h CC: =gcc hello: $(OBJS1) $(CC)$^-o$@ $(OBJS1): $(OBJS2) $(CC)-c$<-o$@ 在这里请注意区别“$^”和“$<”。 (11)退出保存,在shell中键入make-fmakefile1,查看结果。 4.使用autotools生成包含多文件的makefile (1)在原目录下新建文件夹auto。 (2)将上例的两个代码文件“hello.c”和“hello.h”复制到该目录下。 (3)使用autoscan生成configure.scan。 (4)编辑configure.scan,修改相关内容,并将其重命名为configure.in。 (5)使用aclocal生成aclocal.m4。 (6)使用autoconf生成configure。 (7)使用autoheader生成config.h.in。 (8)编辑make。 (9)使用automake生成make。 (10)使用configure生成makefile。 (11)使用make生成hello可执行文件,并在当前目录下运行hello查看结果。 (12)使用makeinstall将hello安装到系统目录下,并运行,查看结果。 (13)使用makedist生成hello压缩包。 (14)解压hello压缩包。 (15)进入解压目录。 (16)在该目录下安装hello软件。 5.根据已知三个源文件编写静态库和动态库,并调试运行出正确结果; 静态库 动态库 错误: 错误提示,找不到动态库文件libadd.so。 程序在运行时,会在/san/ku 和/ku 等目录中查找需要的动态库文件。 若找到,则载入动态库,否则将提示类似上述错误而终止程序运行。 我们将文件 libadd.so复制到目录/ku 中,再试试。 6.有一个计算阶乘的源程序,可以运行出结果,但是结果不对,请使用gdb找出错误并改正错误。 运行结果: 错误. 下面进行调试: 分别在第6,7,9行设置了断点: 然后进行单步调试,发现问题出现在断点9处出现问题,J的值出现错误: 修改结果: 7.实现汉诺塔游戏,要求: 汉诺塔的层数由键盘输入,最少3层,程序执行结果要把移动盘子的步骤显示出来。 (gcc和gdb综合应用) 第六章: linux下文件I/O编程 1、根据视频改写copy_file.c,以只写方式打开目标文件,权限742;将源文件读写指针移动到距离文件开头5KB处,每次读写2KB,并用自己的话描述读写函数功能; 2、fcntl()给文件上锁需要执行几次,为什么? 回答fcntl()实例之后的思考题(如果在一个终端上运行设置读取锁的程序,则在另一个终端上运行设置写入锁的程序,会有什么结果? ),并将hello文件同时加读锁和写锁。 一共两次,第一次执行fcntl函数,在上锁前必须要进行判断是否能够上锁,当能够上锁再执行上锁的功能,返回值是-1,说明未上锁,第二次执行fcntl函数时会返回值为0,上锁成功。 在另一个终端上可以进行正常写入锁,且与读取锁的进程号相等。 可以通过对一个文件的部分进行读锁,对另一部分进行写锁,从而达到对文件的同时上锁和写锁。 3、关于multiplex_select.c源程序问题: (1)什么是I/O多路复用,用自己的话描述? 让多个设备可以同时工作,从而提高效率。 (2)如何判断文件描述符在fd_set中? 通过FD_ISSET语句判断 (3)如何让程序执行case0: 分支语句? 一定时间内,不对文件进行任何写操作,在固定监控时间内没有接收到写入相关文件里数据。 (4)文件描述符集inset的备份: tmp_inset,其在本程序当中的作用是什么? 通过改变其值,.存放检测到的文件描述符,从而判断输入数据的通道但每一次都要重新赋值,否则以后将不会监听到所有文件。 (5)select()函数到底是做什么用的? 用来监测键盘通过哪个通道输入数据,有数据输入的会被他监控到,会把写入的数据写到目标程序上。 4、标准I/O函数和系统调用函数有什么区别? 标准I/O函数是带缓存的,系统调用函数是不带缓存的. 5、有关生产者程序: ./producer120,代表每隔一秒生产一个字符,总共生产20个字符;消费者程序./customer5代表消费5个字符; 在执行生产者程序生产第10个字符时,在另一个终端同时执行消费者程序,请问消费者为什么能消费abcde5个字符? 因为生产者生产字符时是给myfifo文件上写锁的,而写锁是排他锁,它锁住时,其他进程是不能加锁的。 所以在生产者还未生产完字符时,消费者应该消费不了字符,为什么实际执行时能消费字符? ? ? 因为默认循环生产10个字符,当生产到第十个字符时,会对其解锁,所以当执行./customer5时,会将一开始的生产的10个字符,进行消费。 借助GDB调试工具,仿照视频的演示,搞懂生产者消费者程序执行的流程,并用自己的话描述两个源程序执行的关键步骤。 描述了两个共享固定大小缓冲区的线程——即所谓的“生产者”和“消费者”——在实际运行时会发生的问题。 生产者的主要作用是生成一定量的数据放到缓冲区中,然后重复此过程。 与此同时,消费者也在缓冲区消耗这些数据。 该问题的关键就是要保证生产者不会在缓冲区满时加入数据,消费者也不会在缓冲区中空时消耗数据。 要解决该问题,就必须让生产者在缓冲区满时休眠(要么干脆就放弃数据),等到下次消费者消耗缓冲区中的数据的时候,生产者才能被唤醒,开始往缓冲区添加数据。 同样,也可以让消费者在缓冲区空时进入休眠,等到生产者往缓冲区添加数据之后,再唤醒消费者. sprintf(buff,"%c",(sign_start+counter));//将'a'+counter(counter是字符偏移量,这里是0)按字符格式输入到buff字符数组中*/ counter=(counter+1)%sign_count;//将字符偏移量后移,下一个向buff字符数组输入的是'b'*/ sign_start=ALPHABET_START;/*将'a'赋值给sign_start,字符常量可以赋值给整型变量,其值是'a'对应的ASCII吗,即97;*/ sign_count=COUNT_OF_ALPHABET;/*将26赋值给sign_count*/ caseDIGIT: /*数字字符*/ sign_start=DIGIT_START; sign_count=COUNT_OF_DIGIT; lock_set(fd,F_WRLCK);/*上写锁,此时其他进程号对该fd无读写权 if((size=write(fd,buff,strlen(buff)))<0)/*从buff字符数组取strlen(buff)个字符输入到fd文件中;strlen是取字符数组的长度*/ printf("Producer: writeerror\n"); lock_set(fd,F_UNLCK);/*解锁* if((fd=open(myfifo,O_RDONLY))<0) printf("Functioncustomingerror\n") printf("Enjoy: "); lseek(fd,SEEK_SET,0);/*文件读写指针定位在文件开头*/ while(counter while((read(fd,&buff,1)==1)&&(counter /*从fd对应的文件中读1个字符到buff字符变量中*/ fputc(buff,stdout);/*消费就是在屏幕上简单的将字符变量buff打印出来*/ 第七章进程控制开发 (1)、以下是对execlp进行调试之后显示的调试信息,根据此信息回答问题 [Detachingafterforkfromchildprocess14692.(Try`setdetach-on-forkoff'.)] UIDPIDPPIDCSTIMETTYTIMECMD root145621022: 12? 00: 00: 00gnome-terminal root1456514562022: 12? 00: 00: 00gnome-pty-helper root1456614562022: 12pts/100: 00: 00bash root1467514566022: 15pts/100: 00: 00gdbexeclp root1467614675022: 15pts/100: 00: 00/root/7/execlp root1469214676022: 15pts/100: 00: 00ps-ef 辅助说明: gnome-terminal就是终端进程,bash是shell命令的版本类型,多数Linux发行版本采用bash作为其命令版本; 以下是对execlp进行调试之后显示的调试信息,根据此信息回答问题 执行父进程的进程号是多少? 146761467514566145621 执行子进程的进程号是多少? 146921467614675145661456514562 (2)、使用gdb调试waitpid(),如果首先执行的是父进程,会出现什么情况? 如果想要调试子进程应该如何做? ? ? [root@localhost7]#./waitpid Thechildprocesshasnotexited Thechildprocesshasnotexited Thechildprocesshasnotexited Thechildprocesshasnotexited Thechildprocesshasnotexited helloworld Thefatherprocessquitbecausethechildprocessquit. Thereturnofwaitpid()isthechildprocessPID: 4921 如果先执行父进程,且指定子进程为非调试状态,则在屏幕上一直显示Thechildprocesshasnotexited这时候就需要强制退出,如果指定子进程为调试状态,使用C进行调试,会在屏幕上显示5行Thechildprocesshasnotexited,才能获得子进程的pid。 如果先调试子进程,并且子进程为调试状态,使用单步调试s,waitpid会一直监测pc的值,且会在屏幕上一直输出Thechildprocesshasnotexited,直到单步调试到sleep(5)时,会先显示Thechildprocesshasnotexited,再显示将要调试的exit(0),当执行exit(0)后,程序会正常退出。 如果先调试子进程,且指定父进程为非调试状态,使用单步调试,直到执行exit(0)后,程序就会正常退出,这一轮调试结束,在执行s后,从if(pc<0>)始以默认方式调试。 (3)、已知multi_proc可执行程序的一个可能的执行结果,如下所示: [root@localhost~]#./multi_proc Inchild1: execute'ls-l' Inchild2: sleepfor5secondsandthenexit Infatherprocess: 总计96 -rw-------1rootroot11552014-09-26anaconda-ks.cfg drwxr-xr-x2rootroot40962014-09-26Desktop -rw-r--r--1rootroot355072014-09-26install.log -rw-r--r--1rootroot43992014-09-26install.log.syslog drwxrwxrwx10rootroot409602-2608: 27linux -rwxr-xr-x1rootroot576003-1
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- linu 复习