linux复习Word文档下载推荐.docx
- 文档编号:1451897
- 上传时间:2023-04-30
- 格式:DOCX
- 页数:39
- 大小:1.06MB
linux复习Word文档下载推荐.docx
《linux复习Word文档下载推荐.docx》由会员分享,可在线阅读,更多相关《linux复习Word文档下载推荐.docx(39页珍藏版)》请在冰点文库上搜索。
并重命名为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重新编译:
(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.o
gcchello.o-ohello
hello.o:
gcc-chello.c-ohello.o
(9)退出保存,在shell中键入:
make-fmakefile1,查看结果。
(10)再次用vi编辑makefile1,如下所示:
OBJS1:
OBJS2:
=hello.chello.h
CC:
$(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)编辑makefile.am。
(9)使用automake生成makefile.in。
(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;
/*将'
赋值给sign_start,字符常量可以赋值给整型变量,其值是'
对应的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"
Enjoy:
lseek(fd,SEEK_SET,0);
/*文件读写指针定位在文件开头*/
while(counter<
need)
while((read(fd,&
buff,1)==1)&
&
(counter<
need))
/*从fd对应的文件中读1个字符到buff字符变量中*/
fputc(buff,stdout);
/*消费就是在屏幕上简单的将字符变量buff打印出来*/
第七章进程控制开发
(1)、以下是对execlp进行调试之后显示的调试信息,根据此信息回答问题
[Detachingafterforkfromchildprocess14692.(Try`setdetach-on-forkoff'
.)]
UIDPIDPPIDCSTIMETTYTIMECMD
root145621022:
12?
00:
00:
00gnome-terminal
root1456514562022:
12?
00:
00gnome-pty-helper
root1456614562022:
12pts/100:
00bash
root1467514566022:
15pts/100:
00gdbexeclp
root1467614675022:
00/root/7/execlp
root1469214676022:
15pts/100:
00ps-ef
辅助说明:
gnome-terminal就是终端进程,bash是shell命令的版本类型,多数Linux发行版本采用bash作为其命令版本;
以下是对execlp进行调试之后显示的调试信息,根据此信息回答问题
执行父进程的进程号是多少?
146761467514566145621
执行子进程的进程号是多少?
146921467614675145661456514562
(2)、使用gdb调试waitpid(),如果首先执行的是父进程,会出现什么情况?
如果想要调试子进程应该如何做?
[root@localhost7]#./waitpid
Thechildprocesshasnotexited
helloworld
Thefatherprocessquitbecausethechildprocessquit.
Thereturnofwaitpid()isthechildprocessPID:
4921
如果先执行父进程,且指定子进程为非调试状态,则在屏幕上一直显示Thechildprocesshasnotexited这时候就需要强制退出,如果指定子进程为调试状态,使用C进行调试,会在屏幕上显示5行Thechildprocesshasnotexited,才能获得子进程的pid。
如果先调试子进程,并且子进程为调试状态,使用单步调试s,
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- linux 复习
![提示](https://static.bingdoc.com/images/bang_tan.gif)