Linux复习 之基础命令

Linux操作:
1、Linux 文件层次结构

Linux 文件存储时,都是以根目录 "/" 开始的;倒状树
/bin   存放可以在单用户模式下使用的命令的可执行文件;
/etc   存放系统主要的配置文件;
/boot  存放系统开机所需要的核心文件和配置文件;
/root  系统管理员用户的家目录;
/home  普通用户的家目录,用户登录上系统后默认进入自己的家目录下工作;
/proc  一个虚拟文件系统,存放内存上的数据,如:系统核心、进程信息、网络状态等;
/mnt   外部设备临时挂载点;
/lib   存放系统开机或者执行命令时所需要用到的库文件;
/usr  安装的第三方软件;

2、文件管理

Linux基础命令:pwd  cd  ls
文件操作命令:touch mkdir rm rmdir cp mv chmod tar find grep more less
cd + 路径   改变当前工作目录,路径可以为绝对路径或者相对路径;
ls          显示当前目录下的文件        
touch       新增普通文件
rm          删除普通文件                
mkdir       新建目录文件
rmdir       删除空目录                 
rm -r       删除非空目录
cp          拷贝普通文件                 
cp -r       拷贝目录文件
mv          移动(剪切)文件             
chmod       修改文件权限
chown       修改文件属主                  
chgrp       修改文件组用户
pwd         显示当前工作目录绝对路径         
find        查找文件
vim         文本编辑器                       
wc          统计数目
nl          显示文件内容和行号              
umask       显示/设置文件的缺失权限
whereis     搜索命令所在的目录及帮助文档路径
more   cat   less   head   tail  查看文件内容

readelf  nm  显示所有的符号
objdump ldd  显示程序依赖的共享库

vi/vim
命令模式  
末行模式(文本保存,全文搜索,全文替换  :1, $s/oldstring/newstring/g)
--> 光标操作  shift+g   gg   num shift+g <==> :num
   d num shift+g 从当前光标到num行的内容全部删除;
   --> 批处理  yy dd p   

3、权限管理

文件权限的划分:
rw- (文件属主--u)    rw-(同组用户--g)   r--(其他用户--o)
r  代表有读权限;
w  代表有写权限;
x  代表有可执行权限(普通文件)或者 能否进入权限(目录文件);
a)字符修改法:
    chmod   u/g/o/a   +/-/=  r/w/x/rw/rx/wx/rwx    filename
    如:chmod   u+rw   main.c   给main.c文件的属主加上读写权限;
        chmod   g-w   main.c    给main.c文件的同组用户去掉写权限;
        chmod   u+w,g-r,o=r  main.c  给main.c文件的属主加上写权限,
                                     同组用户去掉读读权限,将其他用户的权限设置为只读;
   b)数字修改法:
   r: 4   w: 2   x: 1
   如: chmod  664  main.c   将main.c文件的权限设置为属主可读可写,
                                    用户组可读可写,其他用户可读;

4、进程管理

ps                 显示进程信息               
kill  pid          结束进程
kill  -stop  pid   挂起进程      
kill  -9  pid      强制结束进程
jobs               显示后台和挂起的进程任务      
&                  在后台运行进程
bg                 任务号  将挂起的进程放到后台执行
fg                 任务号  将挂起或后台的进程放到前台执行
pstree             以树状图显示进程

5、系统管理

top    动态显示进程信息以及系统运行统计信息
free   显示系统运行统计信息  ---  内存  buffers/cache   Swap
ipcs -s/-q/-m      分别显示系统的 信息号量、消息队列、共享内存
ipcrm -s/-q/-m id  根据id分别删除 信号量、消息队列、共享内存
lsof     列出当前系统打开的所有文件描述符
mpstat   实时监测多处理器系统上的每个CPU使用情况
vmstat   实时输出系统各个资源的使用情况

用户管理命令:
   useradd/adduser  newname  添加一个新的用户 newname
   参数: -g      执行新用户的主组
          -G      将新用户添加到副组
          -s      指定新用户默认使用的shell终端
          -d      指定新用户登录默认进入的目录
     
     passwd  username    修改用户密码
     userdel username    删除用户

6、网络通讯

ping         测试网络连通性
ifconfig/ip  显示或设置网络设备
netstat/ss   显示网络相关信息
service      管理系统运行的服务器
mail         查看、发送电子邮件
write        给用户发信息

7、关机/重启

a)系统运行级别:(root用户可以通过 init 命令修改运行级别)
    0     关机
    1     单用户模式
    2     不带网络的多用户模式
    3      完全的多用户模式,优先进入字符界面
    4      未定义
    5       xll --- 图形界面模式
    6       重启

b)关机/重启命令
       init   0     关机(root用户才能运行)
       init   6     重启(root用户才能运行)
       halt         立即关机
       poweroff     立即关机
       shutdown     立即关机
       reboot       立即重启

8、文件压缩

a) tar 打包  +  gzip  压缩   -->  生成 .tar.gz 压缩包
b) tar  直接压缩             -->  生成 .tgz 压缩包

 tar cf packagename.tar filelist   打包
 gzip packagename.tar              压缩
 gzip -d packagename.tar.gz        解压
 tar xf packagename.tar            解包
 tar zcf packagename.tgz filelist  压缩
 tar zxf packagename.tgz           解压
 参数:
      c   创建新文件
      f    指定目标为文件而不是设备
      v    显示详细过程
      t    只显示包中内容,而不真正释放
      x    释放文件
      z   (GNU版本新添)完成压缩工作
      
      两个方式可以相互混用,
      通过 tar  压缩的文件 gzip 也可以解压,
      通过 gzip 压缩的文件 tar  也可以解压;

9、编译链接

源文件生成最终的可执行文件分:预编译、编译、汇编、链接;
   a)预编译:gcc -E hello.c    /* -o hello.i */
   b)编译:  gcc -S hello.i    /* -o hello.s */   生成汇编指令代码
      或者: gcc -S hello.c   /* -o hello.s */
   c)汇编:  gcc -c hello.s   /* -o hello.o */  生成可重定位的二进制目标文件
      或者: gcc -c hello.c  /* -o hello.o */
   d)链接:  gcc -o hello hello.o    ---> 生成最终的可执行文件 hello
      或者: gcc -o hello hello.c
      在实际的使用中,一般我们可以将预编译、编译、汇编过程合并到一块,
      (即执行: gcc -c hello.c), 然后执行链接过程(即执行: gcc -o hello hello.o);
      也可以直接通过源文件生成可执行文件(即执行:gcc -o hello hello.c);
      
这四步完成的工作:
    预编译阶段:
       a)删除所有的 "#define", 并展开所有的宏定义;
       b)处理所有的条件预编译指令:"#if", "#ifdef", "#endif" 等;
       c)处理 "#include" 预编译指令,将被包含的文件插入到该预编译指令的位置;
       d)删除所有的注释;
       e)添加行号和文件名标识符,以便编译器产生调试用的符号信息及编译时产生编译错误和警告时显示行号;
       f)保留所有的 #pragma 编译器指令,(编译器需要使用);
    编译阶段:
       词法分析、语法分析、语义分析、代码优化、汇总符号;
    汇编阶段:
        将汇编指令翻译成二进制格式、生成各个  section 、成符号表;
     链接阶段:
        a) 合并各个 section ,调整 section 的起始位移和段大小;
        b)合并符号表,进行符号解析;
        c)符号重定位;
        
        相关命令:
        objdump : 查看目标文件或者可执行的目标文件的构成;
        readelf : 显示一个或多个 elf 格式的目标文件的信息;
        ldd     : 查看可执行程序用到哪些共享库;
        nm      : 查看程序中函数和变量的逻辑地址;

10、gdb 调试

a)debug 版本
      debug版本为可调式版本,生成的可执行文件中包含调试需要的信息,开发人员常用;
      debug 版本的生成:
          因为调试信息是在编译过程时加入到中间文件(.o)中的,
          所以必须在编译时控制其生成包含调试信息的中间文件;
          gcc -c hello.c -g   -->生成包含调试信息的中间文件
          gcc -o hello hello.o
     或者:gcc -o hello hello.c -g
b) release 版本
      release 版本为发行版本,是提供给用户使用的版本,用 gcc 默认生成的就是release版本;
      首先将源代码编译、链接生成debug版本的可执行文件,
      然后通过 gdb debug 版本的可执行文件名 进入调式模式;
 
  1) 单进程、单线程基础调用命令
           l                     显示main函数所在的文件的源代码;
           list filename:num     显示filename文件num行上下的源代码;
           b linenum             给指定行添加断点;
           b funname             给指定函数的第一有效行添加一个断点;
           info break            显示断点信息
           delete 断点号          删除断点信息
           disable 断点号         将断点设置为无效的,如果不加断点号,将所有断点设置为无效;
           enable 断点号          将断点设置为有效的,如果不加断点号,将所有断点设置为有效的;
           r(run)                运行程序
           n(next)               单步执行
           c(continue)          继续执行,直接执行到下一个断点处
           s                     进入将要被调用的函数中执行
           finish                跳出函数
           q                     退出函数
           p val                 打印变量 val 的值
           p &val                打印变量 val 的地址
           p a+b                 打印表达式的值
           p arr(数组名)         打印数组所有元素的值
           p *parr@len           用指向数组的指针打印数组中所有元素的值
           x /nfu addr           打印 addr 表示的内存储存值
                   n: 是一个正整数,表示显示内存的长度
                   f: 表示显示的格式:x:16进制    d: 10进制   o: 8进制
                                    t: 2进制     c:字符      f:浮点数
                   u: 表示从当前地址向后请求的字节数,默认 4bytes,可以指定:
                          b:单字节   h:双字节   w:四字节    g:八字节
         display                  自动显示,参数和 p 命令一样
         info display             显示自动显示信息
         undisplay +自动显示编号   删除指定的自动显示
         ptype val                显示变量类型
          bt                      显示函数调用栈
  
  2)多进程调试命令:
       (gdb) set follow-fork-mode mode
            mode 可以选择 parent 或者 child ,即:选择调试那个进程;
            注意:未被选择的进程会直接执行结束;
     
  3)多线程调试命令:
      info threads          查看线程信息
      thread id             调试目标 id 指定的线程
      set scheduler-locking off | on | step;
              off:表示不锁定任何线程;
              on:只有当前被调试的线程继续运行;
              step:在单步执行的时候,只有当前线程会执行;

11、makefile 文件

主要包括五方面的内容:显示规则、隐晦规则、变量定义、文件指示、文件注释;
  1)功能:
        关系到整个工程的编译规则,也可执行操作系统的命令,
        (好处)实现自动化编译整个工程,提高编译效率(只会编译修改的和依赖于修改的那些文件);
 
  2)简单的编写步骤:
       现在有5个文件,分别为:main.c  my1.h  my2.h my1.c my2.c ;
       现在编写 makefile 文件,名称为 makefile 过程如下:
      a)  main:  main.o  my1.o  my2.o
                  gcc -o main main.o my1.o my2.o
        main.o:  main.c  my1.h  my2.h
                  gcc -c main.c
         my1.o:  my1.c  my1.h
                  gcc -c my1.c
         my2.o:  my2.c  my2.h
                  gcc -c my2.c
         clean:   rm -f *.omain
         
       b)执行命令:
            make 就可以生成可执行文件 main. 如果要删除可执行文件以及所有的中间目录文件,
            只需要执行下 make clean  
            **clean 不是一个文件,它只是一个动作的名字,如C语言中的lable,冒号后什么也不做;
      
      3)文件说明
      在上面的 makefile 文档中,目标文件包括:
          执行文件 main 、中间目标文件(*.o)、依赖文件(就是冒号后面的那些文件);
        每一个 .o 文件都有一组依赖文件,而这些 .o 文件又是执行文件 main 的依赖文件;
         依赖关系的实质上就是说明了目标文件是由那些文件生成的;
     
      4) make 的工作原理
          make 是解析 make file 中指令的命令工具;
          当我们输入 make 时:
               1.make 首先会在当前目录下寻找 makefile 文件;
               2.如果找到,它会找到文件中的第一个目标文件 main ,并把这个文件作为最终的目标文件;
               3.如果 main 文件不存在或者是 main 所依赖的后面 .o 文件的修改时间要比 
                  main 这个文件新,那么,它就会执行后面所定义的命令来生成 main 这个文件;
               4.如果 main 所依赖的 .o 文件也存在,那么 make 会在当前文件中找目标为 .o文件的依赖性,
                   如果找到则在根据那一个规则生成 .o 文件;
               5.由于我的 c  文件和 h 文件都是存在的,所以 make 会生成 .o 文件,
                   然后用 .o文件声明 make 的最终文件,也就是执行文件 main;
               6. make 和 makefile 的联系
                  make是一个命令,makefile 是一个文件,当 makefile 文件写好后,
                  只需要一个make 命令就可以将 makefile 文件运行起来;

12、库文件

库文件是预先编译好的方法的集合;
比如:我们提前写好一些数据公式的实现,将其打包成库文件,以后使用只需要库文件就可以,而不需要重新编写;
库文件:静态库 和 动态库(共享库)
window 系统 :静态库扩展名为:.lib   动态库扩展名为: .DLL
Linux 系统: 静态库扩展名为:.a     动态库扩展名为:.so
   静态库:
     1)特点:
         程序在链接过程中,链接器从库文件中取得所需代码,复制到生成的可执行文件当中,
         因此,静态库是在程序的链接阶段被复制到程序当中,和程序的执行过程没有关系;
     2)创建:
         eg:有两个源文件: main.c   max.c
         a)   gcc  -c  main.c  max.c  (得到 main.o 和 max.o)
         b) 使用 ar 将目录文件归档
              ar  crv  libxxx.a  main.o  max.o
     **libxxx.a  即为我们创建的静态库
  
  动态库(共享库)
       1)特点:
            动态库在链接阶段并没有被加载到程序当中,
            而是 程序在运行时被系统动态加载到内存当中供程序使用;
        2)创建
            eg:有一个源文件  max.c
            a)  gcc  -fPIC  -shared  -o  libxx.so  max.c
         等价于:gcc  -c  -fPIC  max.c
                gcc  -shared  -o  libxx.so  max.o
        **libxx.so  即就是我们生成的共享库         
 
   静态库和共享库的区别: 
      静态库的可执行文件当中包含了库代码的一份完整的拷贝,因此,
      当它被多次使用时就会有多份没有的拷贝在内存当中,所以比较占内存;
      而动态库系统只需载入一次动态库,
      不同的程序可以得到内存当中相同的动态库的副本上,因此会节省很多内存;

13、g++与gcc的区别。

1、gcc现在是Gnu Compiler Collection 提供的一些编译器工具的集合,以前是其提供的c编译器 ;
       g++是C++编译器。
2、gcc可以编译.c和.cpp的源文件,对 .c 按c语言语法规则处理,.cpp自动按C++语法规则处理,
       但不默认链接相应的C++库,需要手动指定链接的库名 "-lstdc++"。
3、g++可以编译 .c 和 .cpp 的源文件,但都是按照C++的语法处理。

14、编译链接原理:预编译 编译 汇编 链接

           预编译(.h)               编译                           汇编
main.c   处理预编译指令  main.i   词法、语法、语义   main.s  将汇编指令翻译为二进制  
test.c   删除注释       test.i    代码优化          test.s  生成符号表             
                                 汇总符号                  生成各个段
                 链接
main.o   合并各个段,调整段大小及段的起始位置               .exe
test.o   合并符号表,进行符号解析 (给符号分配虚拟地址)    a.out(ELF格式)可执行文件
 (只会解析global符号,local符号并不会解析)                     
  符号重定位

15、gcc 的具体使用

预编译:gcc -E main.c -o main.i
编译:  gcc -S main.i
汇编:  gcc -c main.s
链接:  gcc main.o     -->a.out

16、vi 的基本命令使用操作

vi:Unix提供了全屏幕的vi编辑器
    1、三种模式:命令模式、插入模式、末行模式
    2、命令模式转插入模式:iao, IAO
    3、命令模式下的快捷操作:
        nyy  复制n行 , ndd 删除/剪切 n 行 , p 粘贴
    4、末行模式操作:
        :wq  保存并退出  ,:w  只保存, :q 只退出  ,:q! 不保存并退出
  
  Linux 命令
    1、查看进程堆栈命令:pstack + pid
    2、查看共享内存
         ipcs -m             查看系统共享内存
         ipcrm -m shmid      删除共享内存
         ipcs -s             查看信号量
         ipcs -q             查看消息队列
  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值