Linux基础知识

1.Linux下常用的开发工具

1.1Linux下程序开发利器-VIM

1.1.1程序开发常用IDE

(1)常见的IDE(Integrated Development Environment )集成开发环境

  • visual studio
  • IntelliJ IDEA
  • Code::Blocks

(2)IDE的组成

  • 编辑工具:类似文本编辑器,编辑出源码文本
  • 编译、链接工具:把一个源程序编译构建成为一个可执行程序
  • 调试工具:能对执行程序进行源码或汇编级调试 软件工程
  • 管理工具:用于协助多人开发或大型软件项目的管理,如 make、CVS、Subvision、git

(3)Linux下各部分的分解

  • 编辑工具:Vim
  • 编译工具:gcc
  • 调试工具:gdb
  • 软件工程管理工具:makefile  git

1.2vim

  • Vim是从vi发展出来的一个文本编辑器
  • 与Emacs并列,是类Unix系统用户最喜欢的编辑器
  • 在开放源代码方式下发行的自由软件

1.2.1使用

1.2.3程序的构建

  • 预处理:对源代码文件中的文件包含(include)、预编译语句(如宏定义define等)进行分析
  • 编译:就是把C/C++代码“翻译”成汇编代码
  • 汇编:将第二步输出的汇编代码翻译成符合一定格式的机器代码,生成通常以.o为后缀的目标文件
  • 链接:将上步生成的目标文件和系统库的目标文件和库文件链接起来,最终生成了可以在特定平台运行的可执行文件 

1.2.4make的运行

1.2.5准备工作 

包含多个源文件的项目的编译链接过程

 1.3gcc

1.3.1定义与用法

  • GCC(GNU Compiler Collection,GNU编译器套装)
    • 是一套由GNU开发的编程语言编译器。它是一套以GPL及LGPL许可证所发布的自由软件,也是GNU计划的关键部分,亦是自由的类Unix及苹果电脑Mac OS X 操作系统的标准编译器
    • 支持C/C++、java、go等语言
  • 用法: gcc [option] filename [ -l libname]

1.4makefile工作原理

1.4.1简介

  • make和makefile简介
    • makefile是一个配置文件,可以对程序编译进行管理,其优点是:
      • 避免复杂命令行编译语句
      •  减少编译所需时间
      • 让编译自动运行
    • make是解释makefile文件中指令的命令工具
  • make 是什么
    • make是一种自动化工程管理工具。
  • Makefile 是什么
    • 配合 make,用于描述构建工程过程中所管理的对象以及如何构造工程的过程。
  • make 如何找到 Makefile
    • 隐式查找:当前目录下按顺序找寻文件名为“GNUmakefile”、“makefile”、“Makefile”的文件
    • 显式查找:-f

1.4.2多文件的自动编译

 1.4.3MakeFile 的构成

  • Makefile 由一条或者多条规则(rule)组成
  • 每条规则由三要素构成
    • target:目标,可以是 obj 文件也可以是可执行文件
    • prerequisites: 生成 target 所需要的依赖
    • command:为了生成 target 需要执行的命令,可以有多条

  • Makefile 中的其他元素介绍 

  • 注释:  行注释,以“#”开头 

1.4.3Makefile的规则格式

1.4.4makefile的操作规则

  • 如果工程没有编译过,所有的C文件都要编译并被链接。 
  • 如果工程的某几个文件被修改,只需要编译被修改的这几个文件,并重新链接目标程序
  • 如果工程的头文件被修改了,那么所有包含此头文件的源文件都要重新编译,并重新连接目标程序

1.4.5使用变量

  • makefile中可以使用变量
  • 变量类似于C语言的宏,但值可修改
  • 变量名大小写敏感
  • 变量名不应该包含:#=或空格
  • 变量使用时用$(var)形式

  • 环境变量 

  • 自动化变量 

  • 预定义变量 

1.5C语言常见错误

 1.5.1C语法错误

  • 错误信息∶文件source.c中第n行有语法错误(syntex errror)
  • 有些情况下,一个很简单的语法错误,gcc会给出一大堆错误。如: line 1: syntax error: unexpected “(” 

1.5.2头文件错误

  • 错误信息∶找不到头文件head.h(Can not find include file head.h)。
  • 这类错误是源代码文件中的包含头文件有问题,可能的原因有头文件名错误、指定的头文件所在目录名错误等,也可能是错误地使用了双引号和尖括号。

1.5.3档案库错误

  • 错误信息∶链接程序找不到所需的函数库(ld: -lm: No such file or directory )。
  • 这类错误是与目标文件相连接的函数库有错误,可能的原因是函数库名错误、指定的函数库所在目录名称错误等,检查的方法是使用find命令在可能的目录中寻找相应的函数库名,确定档案库及目录的名称并修改程序中及编译选项中的名称。

1.5.4未定义符号

  • 错误信息∶有未定义的符号(Undefined symbol)。
  • 这类错误是在链接过程中出现的,可能有两种原因∶一是使用者自己定义的函数或者全局变量所在源代码文件,没有被编译、连接,或者干脆还没有定义,这需要使用者根据实际情况修改源程序,给出全局变量或者函数的定义体;二是未定义的符号是一个标准的库函数,在源程序中使用了该库函数,而连接过程中还没有给定相应的函数库的名称,或者是该档案库的目录名称有问题,这时需要使用档案库维护命令ar检查我们需要的库函数到底位于哪一个函数库中,确定之后,修改gcc连接选项中的-l和-L项。

1.6编码中的调试技巧

1.6.1日志

  • 使用printf输出到终端或者使用fprintf输出到文件  

  • 优点:简单,不用借助其他工具  

  • 缺点:性能不是很好,效果有时不理想

  • 插入的位置、粒度等都需要调试者去权衡,如果插入过多,则频繁的IO操作会使程序运行变慢,线程行为改变,有些bug甚至不会再出现 

  • 系统调用syslog  (man syslog)

  • 自行封装

  •  第三方日志库  zlog  、log4c

1.6.2断言

宏的形式(assert(expression))定义在<assert.h>文件中。     assert 将通过检查表达式 expression 的值来决定是否需要终止执行程序。也就是说,如果表达式 expression 的值为假(即为 0),那么它将首先向标准错误流 stderr 打印一条出错信息,然后再通过调用 abort 函数终止程序运行;否则,assert 无任何作用。

1.6.3内存错误

  • 从OS角度看内存错误的原因
    • 访问不存在的内存地址
    • 访问系统保护的内存地址
    • 访问只读的内存地址
    • 栈溢出
  • 从码农角度看内存错误的原因
    • 内存分配未成功却使用
    • 内存分配成功未初始化就使用
    • 内存的操作越界,如数组越界
    • 释放了内存却继续使用

1.6.4GDB调试的基本命令

  • list:显示源码
  • Break num 设置断点
  • Run 运行可执行文档
  • Next: 单步执行 不进入函数
  • Step:单步执行(进入函数)
  • Bt:显示调用栈
  • Info register eip显示某寄存器内容

 2.shell命令及脚本

2.1shell及shell脚本的作用

2.1.1Shell简介

  • Shell是用户与系统 沟通的桥梁
  • 一种脚本编程语言
    • 包含变量、循环、函数等常见编程语言的元素
    • 通过解释器读入程序的代码,解释执行,无需编译
  • 命令解释器
    • Shell提供了用户与操作系统交互所需的交互界面
    • 能够解释执行shell脚本编写的程序
  • Shell的种类
    • 不止一种shell解释器
    • /bin/sh (已经被/bin/bash 所取代)
    • /bin/bash (Linux 预设 shell) /bin/ksh (Kornshell 由 AT&T Bell lab.开发,兼容 bash)
    • /bin/zsh (基于ksh 开发,功能更强的 shell)
    • /bin/csh (已经被/bin/tcsh 所取代)
    • /bin/tcsh (整合 C Shell ,提供更多的功能)
  • 如何看自己目前的shell?
    • echo $SHELL(查看当前运行的Shell)
    • cat /etc/shells(查看系统支持的Shell)
    • /etc/shells文件登记了本系统上合法的shell解释器
  • Shell的选择        
    • FreeBSD default shell ->csh/tcsh     Linux default shell->sh/bash
    • 此讲以bash为主

2.1.2Shell脚本编程优点

  • 简单性
    • Shell作为一个高级脚本语言,可以简单地表达复杂的操作
  • 可移植性
    • 基于POSIX(Portable Operating System Interface)标准所定义的功能开发,脚本无需修改就可以在不同的Linux发行版上运行
  • 开发相对容易 可以在短时间内开发出功能强大的脚本工具

2.1.3如何使用命令帮助

  • 只记得部分命令关键字:man -k;
  • 某个命令的简要说明:whatis;
  • 某个命令的详细介绍:info;
  • 查看命令的位置:which;
  • 命令的具体参数及使用方法:man

2.2Linux Shell基础知识

2.2.1Linux目录结构

  • /                  根目录,一般根目录下只存放目录,不存放文件
  • /home        系统默认的用户宿主目录
  • /usr/bin      该目录为命令文件目录,也称为二进制目录
  • /usr/sbin 放置系统管理员使用的可执行命令
  • /etc      系统配置文件的所在地,一些服务器的配置文件也在这里;
  • /var      经常变动的目录,/var下有/var/log 是用来存放系统日志的目录
  • /tmp       临时文件目录,有时用户运行程序的时候,会产生临时文件
  • /dev       设备文件存储目录,比如声卡、磁盘... ...

2.2.2绝对/相对路径

  • 绝对路径:一定由根目录  / 写起

    • 写shell最好用绝对路径

    • 如何查绝对路径:which command? pwd

  • 相对路径:不是由 / 写起,指相对于当前工作目录的路径 .    

    • #当前目录 ..    

    • #上一层目录 ~  

    •  #home目录  

2.2.3命令

  • 单一指令

    • ls

    • ps –aux

    • netstat –an

  • 连续指令

    • mkdir /backup;cp /.* /backup/; ls

  • 条件指令

    • 逻辑与(&&)    grep google sampleCom.txt && more sampleCom.txt

    • 逻辑或(||)   cc prog.c|| echo ‘compile error’ 

  • 内建命令

    • 是由shell本身所执行的命令

    • 解析内建命令shell不需要创建子进程

    • 比如:exit,history,cd,echo等

  • 外部命令

    • 在bash之外额外安装的,通常放在/bin,/usr/bin,/sbin,/usr/sbin......等等,比如:ls、vi等。

    • 存在于文件系统中某个目录下的单独的程序

  • 如何辨别内建命令和外部命令?

    • 使用type可以查看是否是内建命令

2.2.4命令补全

  • 输入目录名或文件名或命令名的开头部分,Linux根据输入的字母自动补全剩余部分。
  • 方法: 按tab键

2.3Shell中的特殊符号

2.3.1特殊字符

  • 一般通配符
  • 引号
  •  输入/输出重定向
  • 注释、管道操作符、作业管理符号

2.3.2一般通配符

  • 星号(*)     匹配任意字符的出现。
  • 问号(?)      匹配任意一个字符。
  • 方括号([ ])       匹配括号内所限定的任何一个字符

2.3.3引号

shell提供了一系列字符来消除特殊字符的特殊含义。     例如:<   >   “   ‘   $   ?   &   |   \   *

  • 1.双引号 双引号中,除 $ 、 ’ 、 \
    • 这三个以外的任意元字符都是普通字符。
    • 双引号保留空白字符(空格、制表符、换行符)
    • 无法消除双引号自身的特殊含义
  • 单引号
    • 一对单引号中除单引号自身以外的任何字符按该字符字面解释。
    • 用反斜杠消除单引号的特殊含义
    • 单引号也同样保留空白符。
    • 比较:echo  “`pwd`”和echo ‘`pwd`’            echo “$HOME”和echo ‘$HOME’
  • 倒引号
    • 也称为命令替换符
    • 将命令的输出插入到命令行的相应位置上。

2.3.4反斜线

  • 反斜线是转义字符,它能把特殊字符变成普通字符。在某个字符前面利用反斜杠(\)能够阻止shell把后面的字符解释为特殊字符。
  • 例4:   [Ubuntu@ubuntu]echo  “Filename  is  N0\$\*” Filename  is  N0$*      
  • 注意:在单引号括起来的字符串中,反斜线也成为普通字符,而失去转义字符功能。

2.3.5注释

  • shell将#看作注释符号,忽略#后的字符
  • 说明 shell脚本中第一行:     #!/bin/bash     表示后面所跟的字符串是所使用shell的绝对路径。

2.3.6输入/输出重定向

  • 输出重定向
    • >  : 输出重定向
    • >> :将命令执行结果追加到指定的文件中
    • 举例:
      •  # ls ./ > result.txt      
      • #资料夹中的子资料夹存到 result.txt中
      •  # echo “appending text”>> result.txt                              
      • #追加appending text到result.txt中
  • 输入重定向
    •  <:从文件到命令
      • WC [选项] [文件名]  
      •   -c  统计字节数  
      •   -w  统计单词数  
      •   -l    统计行数

2.3.7管道

  • 管道:    
    • 改变标准输入的源或者是标准输出的目的地
    • command1 | command2
    • 举例
      • # ls |wc –w                             #计算字数
      • # cat /etc/passwd | sort        #将/etc/passwd排序
      • # history | less                      #查看history中的历史

2.3.8作业管理符号

  • 后台服务符号“&” :    
    • 使Shell在后台执行该任务,用户可以立即看到一个提示符,并继续其它工作。
    • command &
    • 举例
      • #d & e & f   #在后台执行任务d和e,而在前台执行任务f
      • #(a , b)& c & #在后台先后执行命令a和b,与此同时还在后台执行c。这里注意任务a和b是相继启动的,而不是同时运行的
  • jobs:列出作业
    • 内置命令jobs将列出所有后台作业。
  • 挂起作业:    
    • 按下挂起键(通常是CONTROL+Z)会立即挂起前台的作业,并显示一条包含Stopped的消息
    • 举例  
      • [2]+ Stopped find /usr –name ace  -print >findout
  • bg:
    • 将作业移到后台运行     将一个前台作业转移到后台执行之前,必须首先按下挂起键将作业挂起(暂时停止运行),然后使用内置命令bg将该任务放在后台继续执行
    • 举例  
      • $bg [2]+ find /usr –name ace  -print >findout &

2.4linux的基本命令

2.4.1linux基本命令

  1. echo  可待双引号或不带双引号,双引号可进行特殊字符 参数  -n  不换行    -e  解析输出内容中的转义字符  \a  \t  \n  \c
  2. Read  从键盘读入信息赋给变量 遇到回车或文件结束符为止 例子  read  name   surname   回车   输入John   tom    则 name 为 john   surname 为tom
  3. Cat 用来显示文件内容或控制字符

2.4.2输入输出重定向

  1. 标准输入文件 STDIN 代号0  
  2. 标准输出文件STDOUT  代号1  
  3. 标准错误输出文件 STDERR 代号为2
  4. 输入输出重定向  <     <<     >    >>

2.4.3管道命令    |    ls | grep file

  1. sort 对不同的数据类型进行排序   参数  -u -r   -n    例子:num.txt
  2. Split  进行文件分割   spilt -2 num.txt ff

2.4.4系统管理命令

  1. 目录操作命令  pwd、cd 、 ls、 mkdir、rmdir
  2. 文件操作命令  touch、file、 cp、rm、mv、find、grep、tar、ln

2.4.5权限管理命令

  1. 用户  /etc/passwd     /etc/shadow 文件   useradd、userdel、passwd、
  2. 用户组:查看文件/etc/group   /etc/gshadow   、groupadd、groupdel
  3. 文件权限归属:chmod、chown、chgrp
  4. 用户切换  su、sudo、login

2.4.6作业管理

&、 bg、fg

2.4.7关闭系统

exit、reboot、init 0、shutdown、halt、poweroff

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小鱿鱼G

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值