linux基本知识整理

1:nslookup命令,解析域名对应的ip,例如nslookup www.baidu.com,解析百度的ip;


2:利用lftp来上传和下载目录文件,上传目录文件,mirror -R 目录名称,下载目录为mirror 目录名称,对于匿名用户登录,首先通过修改vsftpd配置文件,允许匿名用户登录(即anonimous)相关的配置项,重启vsfptd,通过命令 lftp ip地址,然后回车,然后接着输入login即为匿名用户登录;mput,mget,即多个文件上传下载;对于ftp的匿名用户登录为:ftp ip地址,然后回车,然后在输入anonimous,回车,不用输入密码,即为匿名用户登录;


3:查看某个目录的文件,通过tree 目录文件来查看


4:nfs(network file share)网络文件共享,需要安装服务端,即nfs,例如yum install  nfs-utils.x86_64和rpcbind(针对centos7版本),安装完之后可以在/etc/exports文件里面增加共享文件目录(前提要求该文件夹在服务器上存在),格式为:/home/pengft/Share *(rw,sync),其中该行第一个字符串表示的是共享文件目录路径,第二个*表示的支持所有的网段,我们也可以通过设置网段来实现,后面緊跟着的是表示对共享目录的操作权限,具体可以百度一下,以上操作完来之后,然后在客户端机器上面挂载,命令格式为:mount IP:目录 挂载的目录,例子:mount 172.16.66.181:/home/pengft/Share /mnt


6:vim编辑器的基本操作命令:
1》:行首:0;
2》:行尾:$;
3》:文件开始位置:gg(哥哥);
4》:文件尾部:G;
5》:删除一个单词:dw(要求光标在该单词首部,否则删除只是单词部分),全称delete word
6》:删除光标至行首:d0;
7》:删除光标至行尾:D或者d$;
8》:撤销:u;
9》:反撤销:ctrl+r
10》:粘贴:p;
11》:多行复制:nyy,其中n为多行对应的数字;
12》:复制部分文字,需要进入可视模式,利用v进入可视模式,然后通过移动光标来控制选中的文本;如果想复制或者删除,按一个y或者一个d
13》:文字查找,除了/和?之外,还可以通过#来,前提要求把光标放在需要查找的文字上;
14》:如果在文本中看到一个函数,可以通过K进入man命令查看其命令参数,默认是进入第一章节(讲述的都是命令参数相关的),函数说明一般是在第三章里面(可以通过man man命令查看章节的具体内容)
15》:ctrl+l,等于clean,清屏操作;
16》:vi进入末行模式(输入:),然后输入!加shell命令,即可执行shell命令
17》:命令模式下退出保存,按两个大写的Z,即ZZ
18》:vi水平分屏,末行模式加sp,即:sp,默认将本文件,ctrl+w+w,进行切换,全部保存,wqall,垂直分屏:vsp+文件名,不带文件名默认将本文件打开


7:编译:
1.预处理,生成预编译文件(.文件):


        Gcc –E hello.c –o hello.i
    2.编译,生成汇编代码(.s文件):


        Gcc –S hello.i –o hello.s
    3.汇编,生成目标文件(.o文件):
        Gcc –c hello.s –o hello.o
    4.链接,生成可执行文件:
        Gcc hello.o –o hello
        
        具体可以通过键盘的esc按钮来记忆,其中e为大写的。
2》:编译选项
  -I 加头文件路径 -D 宏,-O1,O2,O3(优化),-W(告警),-g,增加调试信息;
  
8:静态库制作及使用;
1):生成.o文件,即gcc -c 源码.c;
2):打包,通过命令:ar rcs 静态库名字 .o文件;
是使用静态库的时候,通过头文件定义的函数,在编译的时候,添加参数-L指定库的存放路径,-l指定库的名称(去掉前面的lib和后面的.a或者.so)查看库文件使用命令nm;


9:共享库制作(即动态库)
1》:生成与位置无关的.o文件;gcc -fPIC -c *.c即可生成与位置无关的.o文件;
2》:把.o文件打包生成.so文件,利用gcc工具;gcc -shared -o libpengft.so *.o
ldd查看程序允许依赖的动态库


对于共享库在链接的时候发现找不到的解决方案有以下4种:
1:把动态库考到/lib目录下,默认链接的时候回在该文件夹下面查找,这种是临时方案;
2:通过export命令,将动态链接库的路径添加到LD_LIBRARY_PATH下,这种也是临时的,重新打开一个终端之后就回失效;
3:将第2种命令添加到home目录下的.bashrc下面,这种是针对该用户默认的shell是bash的情况,请他shell大致情况类似;
4:修改链接器配置文件,即/etc/ld.so.conf,将动态库绝对路径添加在里面,然后执行命令ldconfig -v更新;-v是显示提示信息(需要注意的时候,在编译的时候指定了-L选项,理论上应该已经包含了动态库的路径了,为什么还需要重新通过设置环境变量或者修改ld.so.conf来寻找动态库;


10:gdb调试
list显示文件内容,默认显示带有main的文件,如果想要查看其它文件,可以使用命令list(l) +文件名称+冒号(:)+行数或者函数名;
break设置断点,默认是不带条件的,可以设置条件断点,例如b 15 if i == 15,表达的意思是在15设置断点,当i等于15的话则停止;
start执行程序,只执行来一步,或者执行命令run
next(n)单步执行;
continue(c),执行剩下的步骤;
step(s)进入函数内部;
information(i)查看信息,比如断点信息,i b,或者线程信息,i thread
print(p),查看某些变量的值;
ptype,查看变量类型;
display,追踪某个变量的值,display i;例如对于for循环,追踪其条件变量值的变化;每循环一次,都会把追踪的变量值打印出来;
undisplay,停止追踪变量,undisplay +编号,这个编号,通过info display查看追踪变量编号;
u,跳出单步循环;相当于for循环里面的continue;
finish,跳出函数体,即step进去之后,跳转出来;
delete,删除断点,d +断点编号,通过info b来查找断点编号;
set,设置变量的值,set var i=10;主要针对一些for循环的条件断点;通过手工设置变量值,迅速达到条件标准;
gdb多线程调试;
1. 默认设置下,在调试多进程程序时GDB只会调试主进程。但是GDB(>V7.0)支持多进程的分别以及同时调试,换句话说,GDB可以同时调试多个程序。只需要设置follow-fork-mode(默认值:parent)和detach-on-fork(默认值:on)即可。
      follow-fork-mode  detach-on-fork   说明
parent                   on               只调试主进程(GDB默认)
child                     on               只调试子进程
parent                   off              同时调试两个进程,gdb跟主进程,子进程block在fork位置
child                     off              同时调试两个进程,gdb跟子进程,主进程block在fork位置
   设置方法:set follow-fork-mode [parent|child]   set detach-on-fork [on|off]


   查询正在调试的进程:info inferiors
   切换调试的进程: inferior
   添加新的调试进程: add-inferior [-copies n] [-exec executable] ,可以用file executable来分配给inferior可执行文件。
   其他:remove-inferiors infno, detach inferior


2. GDB默认支持调试多线程,跟主线程,子线程block在create thread。
   查询线程:info threads
   切换调试线程:thread


11:makefile基本知识:
1》:三要素,目标,依赖,命令;格式为:
目标:依赖
命令
以上的空格一定是以tab键开头
第一个目标表示的是第一个最终目标,如果发现依赖不存在,则往下走,寻找其依赖的子目标,
makefile函数:
wildcard,获取某个目录下面的指定文件,其中函数都有返回值的,格式为src=$(wildcard ./*.c),该例子表示,将wildcard返回值赋值给变量src,其中函数名与参数必须以空格分开;
patsubst,将文件替换称指定的后缀,例如:obj=$(patsubst ./%.c,%.o,$(src)),这里通过%模式匹配,意思是将src中获取的.c文件全部替换成.o结尾的名称;
"$<",表示的目标文件的第一个依赖文件,例如:
%.o:%.c
gcc -c %< -o $@,假如目录下有main.c,test.c,这句话的意思就是生成对应的main.o,test.o文件,其中main.o的依赖文件为main.c,%<表示的就是main.c这个依赖文件;$@表示就是当前规则对应的目标文件,如果变量是以大写定义的,说明这些变量是makefile自定义的变量;

一个完整的例子:
src=$(wildcard ./*.cpp)
obj=$(patsubst ./%.cpp,./%.o,$(src))


app:$(obj)
        gcc  $(obj) -o app


%.o:%.cpp
        gcc -c -g $< -o $@
        
.PHONY clean:
clean:
rm $(obj) app -f

其中如果规则没有相应的依赖,则为一个伪目标,主要用于执行下面对应的命令;不过在执行的时候,必须指定其目标名称,不然默认执行的是默认目标的规则,例如,make clean,其中.PHONY表示声明一个伪目标,即使对应的目录下有clean文件,执行make clean也不会报错,不然的话,如果目录下有clean文件,则会一直报目标文件已经最新;


如果不想命令因为某些原因报错,导致下面的命令无法执行,则在命令前面加一个"-"表示忽略错误,继续执行,例如"-rm $(obj),即使这个命令执行失败,对于下面的命令也是可以执行的,不然会直接报错,退出程序。

你可能感兴趣的:(linux知识)