Linux系统(简介、文件管理、常用命令、账号管理、c开发工具)

文章目录

  • 1. Linux系统
  • 2.文件管理与常用命令
    • 2.1 文件和目录的层次结构
    • 2.2 文件和目录命名
    • 2.3 shell文件名通配符
    • 2.4 文件管理
      • 2.4.1 Linux常用文件类型
      • 2.4.2 Linux目录常见概念
      • 2.4.3 常见命令
        • 2.4.3.1 cat:显示文件内容
        • 2.4.3.2 ls:文件名列表
        • 2.4.3.3 more: 分屏显示文件内容
        • 2.4.3.4 less命令
        • 2.4.3.5 head命令
        • 2.4.3.6 tail 命令
        • 2.4.3.7 cp:拷贝文件
        • 2.4.3.8 mv: 移动文件
        • 2.4.3.9 rm:删除文件
        • 2.4.3.10 sort命令
        • 2.4.3.11 uniq命令
        • 2.4.3.12 wc命令
        • 2.4.3.13 comm命令
        • 2.4.3.14 diff命令
    • 2.5 目录管理
      • 2.5.1 路径名
      • 2.5.1常用命令
        • 2.5.1.1pwd/cd :打印/改变当前目录
        • 2.5.1.2 mkdir/rmdir :创建/删除目录
        • 2.5.1.3 cp:复制目录
        • 2.5.1.4 find :在目录中查找文件
    • 2.6 文件的归档与压缩处理
      • 2.6.1 tar :文件归档
      • 2.6.2 compress/uncompress:文件压缩和解压缩
    • 2.7 硬链接和软链接
      • 2.7.1 硬链接
        • 2.7.1.1 ln: 普通文件的硬连接
      • 2.7.2 软链接
        • 2.7.2.1 符号链接
    • 2.8 文件和目录的权限
      • 2.8.1 chmod命令
      • 2.8.2 umask命令
  • 3 Linux开发工具
    • 3.1 编辑器vi/vim的使用
    • 3.2 gcc的使用
      • 3.2.1 gcc概述
      • 3.2.2 gcc编译流程分析
      • 3.2.3 举例
      • 3.2.4 多文件编译
      • 3.2.5 Linux库的创建与使用
        • 3.2.5.1 什么是库?
        • 3.2.5.2 静态库的创建和使用
        • 3.2.5.3 动态库的创建和使用
    • 3.3 调试器gdb的使用
      • 3.3.1 gdb介绍
      • 3.3.2 调试器gdb的使用
    • 3.4 工程管理器make的使用
      • 3.4.1 make的概念
      • 3.4.2 Makefile的文件格式
  • 4.Linux账号管理
    • 4.1 Linux账号与组群
      • 4.1.1 用户标识符:UID与GID
      • 4.1.2 用户账号
      • 4.1.3 用户组
    • 4.2 账号管理
      • 4.2.1 新增与删除用户
      • 4.2.2 用户身份切换
      • 4.2.4Linux主机上的用户信息传递

1. Linux系统

  • Linux是一款自由、免费的操作系统,极具影响力

  • 支持众多处理器架构、拥有大量开源软件

  • 具有稳定性、可靠性和灵活的可配置性

  • 除让个人桌面系统以外,在其他所有竞争领域中几乎占主流地位

2.文件管理与常用命令

2.1 文件和目录的层次结构

  • / 根目录

    所有目录或文件的起点

  • /boot 目录

    存放系统引导文件

  • /etc目录

    供系统维护管理用的命令和配置文件

    passwd文件:用户相关的配置信息

    issue文件:登录前在login之上的提示信息

  • /bin

    系统常用命令,是二进制可执行程序,如ls,ln,cp,cat等

  • /home

    用户目录,用于存放除了超级用户以外的其他个人用户数据。个人用户的主目录在此目录下。

  • /root

    超级用户的主目录。root主目录位置保证了即使其他分区出问题,root也能正常工作

  • /tmp

    存放临时文件

  • /dev

    存放设备文件,如终端设备,磁带机,打印机等

  • /usr

    二级目录结构,UNIX系统资源,巨大多数应用软件都以这个目录为起点,这是Linux桌面系统中最大的目录

  • /usr/include

    C语言头文件存放目录

  • /usr/tmp

    存放临时文件

  • /usr/bin

    存放一些常用命令,如echo,grep,kill等

  • /lib,/usr/lib

    存放各种库文件,指C语言的链接库文件,以及terminfo终端库等等

    静态链接库文件有.a后缀(archive,存档)

    动态链接库文件后缀是.so(shared objects)

    Linux缺省情况下首先连接动态链接库[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-cEtWEXv0-1585219775427)(/Users/tian.e.y/Library/Application Support/typora-user-images/截屏2020-03-26 14.17.23.png)]

2.2 文件和目录命名

  • 名字长度:允许1-256字符

  • 取名的合法字符 大小写字母有区别

​ 文件名的字符包括:字母、数字、.(点)、_(下划线)和-(连字符)。

​ 有些转意字符在 Linux 的命令解释器(shell)中有特殊的含义。这样的转意字符 有:?(问号)、*(星号)、 (空格)、$(货币符)、&、扩号等等。

在文件名中应尽量避免使用这些字符。文件名中可以有 (空格),但建议用户用_(下划线)来替代。/ 既可代表目录树的根也可作为路径名中的分隔符(类似DOS下的 \),因此 / 不能出现在文件名中。

2.3 shell文件名通配符

  • 星号 *

    匹配任意长度的文件名字符串(包括空字符串)

  • 点字符(.),

    当它作为文件名或路径名分量的第一个字符时,必须显式匹配

  • \(反斜线)

    也是一个特殊的字符。它屏蔽后继特殊字母的特殊含义(转意),使该字符仅取其符号所代表的字面意义。

例:*file匹配file,makefile,不匹配.profile文件

​ try*c 匹配try1.c try.c try.basic

  • 问号 ?

    匹配任一单字符

  • 方括号 [ ]

    匹配括号内任一字符,也可以用减号指定一个范围

    例: [A-Z]* *.[ch] [Mm]akefile

    注意:文件名通配符规则与正则表达式的规则不同,应用场合不同.不同种类shell通配符规则会略有些差别[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-NaAuHriP-1585219775428)(/Users/tian.e.y/Library/Application Support/typora-user-images/截屏2020-03-26 14.36.03.png)]

2.4 文件管理

2.4.1 Linux常用文件类型

  • 普通文件

    最常用的一类文件,其特点是不包含文件系统的结构信息。通常用户所接触到的文件,如图形文件、数据文件、文档文件等都属于这种文件。

  • 目录文件

    目录文件是用于存放文件名及其相关信息的文件。是内核组织文件系统的基本节点。

  • 链接文件

    是一种特殊文件,实际上是指向一个真实存在的文件链接,类似于Windows下的快捷方式。分为硬链接文件和软链接文件。

  • 设备文件

管道文件:一种特殊文件,主要用于不同进程间的信息传递

2.4.2 Linux目录常见概念

  • 路径:用’/’隔开 相对路径 绝对路径

    pwd命令:显示当前路径

  • 根目录

​ “/”:所有目录的起点,操作系统本身的驻留程序存放在以根目录开始的专用目录中。

  • 用户主目录

    用户主目录是系统管理员增加用户时

    sudo passwd root //Ubuntu初始时不建立root用户,需要设置密码后才建立好root用户

2.4.3 常见命令

2.4.3.1 cat:显示文件内容

cat[选项] [文件名]

举例:

cat try.c
    在终端显示出文本文件try.c的内容。
cat > try.txt
     从标准输入(键盘)获取数据,直到按ctrl+d键标志输入结束。键盘输入内容存入文件try.txt
cat try1.c try2.c try.h
      将3个文件按顺序输出
cat try1.c try2.c try.h > trysrc 
     将三个文件一起输入到trysrc中
cat makefile*.[ch] > src

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-zBzUYza1-1585219775429)(/Users/tian.e.y/Library/Application Support/typora-user-images/截屏2020-03-26 15.02.37.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-gXnIOKgt-1585219775429)(/Users/tian.e.y/Library/Application Support/typora-user-images/image-20200326150303941.png)]

2.4.3.2 ls:文件名列表

ls[选项] [目录名或文件名]

  • 基本功能

不给出实参时,列出当前目录下所有文件和目录

实参为文件时,列出文件项

实参为目录时,列出目录下的所有文件项

在同一命令行中可以指定多个实参

  • 选项-F (Flag)

若列出的是目录,就在名字后面缀以斜线 /

若列出的是可执行文件,就在名字后面缀以星号 *****

若列出的是符号连接文件,就在名字后面缀以符号**@**

若列出的是普通文件,则名字面后无任何标记

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-2A66fbyt-1585219775430)(/Users/tian.e.y/Library/Application Support/typora-user-images/image-20200326150629667.png)]

  • ls选项-l: 长格式列表

    例:ls -l arg

    -rwxr-x–x l liang stud 519 Jul 5 15:02 arg

    第1列:文件属性

    第1字符为文件类型

    - 普通文件 b 块设备文件(Block)

    d 目录文件(Dir) c 字符设备文件(Char)

    l 符号连接文件(Link) p 命名管道文件(Pipe)

    文件的访问权限(rwx读权限,写权限,可执行权限)

    2-4字符: 文件所有者对文件的访问权限

    5-7字符: 同组用户对文件的访问权限

    8-10字符:其它用户对文件的访问权限

    第2列:文件link数或目录子目录数*

    第3列,第4列:文件主的名字和组名

    第5列 文件大小

    普通磁盘文件:列出文件大小(字节数)

    目录:列出目录表大小,不是目录下文件长度和

    符号连接文件:列出符号连接文件自身的长度

    字符设备和块设备文件:列出主设备号和次设备号

    管道文件:列出管道内的数据长度

    第6列:文件最后一次被修改的日期和时间

    第7列:文件名

    对于符号连接文件,附带列出符号连接文件的内容

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Fu3glmxr-1585219775430)(/Users/tian.e.y/Library/Application Support/typora-user-images/截屏2020-03-26 15.19.26.png)]

2.4.3.3 more: 分屏显示文件内容

选项 说明
-num 指定屏幕上一次所显示的行数;
-d 提示使用者,在画面下方显示 –More-- [Press space to continue, ‘q’ to quit.] ,如果使用者按错键,则会显示 [Press ‘h’ for instructions.]
-l 取消遇见特殊字元 ^L(送纸字元)时会暂停的功能;
-f 计算行数时,以实际上的行数,而非自动换行过后的行数(有些单行字数太长的会被扩展为两行或两行以上);
-p 不以卷动的方式显示每一页,而是先清除屏幕后再显示内容;
-c -p 相似,不同的是先显示内容再清除其他旧资料;
-s 当遇到有连续两行以上的空白行,就代换为一行的空白行;
-u 不显示下引号 (根据环境变数 TERM 指定的 terminal 而有所不同);
+/ 在每个文件显示前搜寻该字串(pattern),然后从该字串之后开始显示;
+num 从第 num 行开始显示。
  • 按空格键,显示文本的下一屏内容

  • 按Enter键,显示文本的下一行内容

  • 按斜线符号(/),接着输入一个模式,可以在文本中寻找下一个相匹配的模式。

  • 按Q键,退出more命令。

2.4.3.4 less命令

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-dV4g4AKp-1585219775431)(/Users/tian.e.y/Library/Application Support/typora-user-images/image-20200326154042895.png)]

2.4.3.5 head命令

  • 功能:显示文件的头几行

  • 格式:head –number filename

  • 显示前number行,若不指定则显示10行。

  • 实例:head -5 /etc/adduser.conf

2.4.3.6 tail 命令

  • 功能:显示文件的最后几行
  • 格式:tail -n filename
  • 显示文件的最后n行

tail -5 /etc/adduser.conf

2.4.3.7 cp:拷贝文件

  • 命令功能:复制文件或目录

  • 命令格式:cp [选项] 源文件或目录 目标文件或目录

-a 该选项通常在复制目录时使用。它递归地将源目录下的所有子目录及其文件都复制到目标目录中,并且保留文件链接和文件属性不变。它等效于-dpr
-d 复制时保留文件链接;
-f 若目标文件或目录已存在,则覆盖已存在的目标文件或目录并且不提示;默认
-i 和f选项相反,在覆盖目标文件之前将给出提示要求用户确认。回答y时目标文件将被覆盖,是交互式复制;
-p 此时cp除复制源文件的内容外,还将把其修改时间和访问权限也复制到新文件中;
- R-r 若给出的源文件是一目录文件,此时cp将递归复制该目录下所有的子目录和文件至目的地。此时目标文件必须为一个目录名;
-l 不复制,而是创建指向源文件的硬链接文件,链接文件名由目标文件给出。
-s 对源文件建立符号链接,而非复制文件

2.4.3.8 mv: 移动文件

  • 基本语法

    mv [选项] 源文件或目录 目标文件或目录

    选项:-i 交互式操作;-f:禁止交互操作。

  • 功能

    使用mv命令可以将文件和目录改名

​ 可以将文件和子目录从一个目录移动到另一个目录

2.4.3.9 rm:删除文件

rm *file1 file2 ...* *filen*

  • 选项

-r 递归地(Recursive)删除实参表中的目录,也就是删除一整棵目录树。

-i 每删除一个文件前需要操作员确认(Inform)

-f 强迫删除(Force)。只读文件也被删除并且无提示

正在运行的可执行程序文件不能被删除

2.4.3.10 sort命令

  • 功能说明:将文本文件内容加以排序,sort可针对文本文件的内容,以行为单位来排序。

  • 格式:sort [选项] filename

•-m 将已排序的输入文件,合并为一个排序后的输出数据流。

•-n 以整数类型比较字段

•-o outfile 将输入写到指定文件,而非标准输出。如果该文件为输入文件之一,则sort 在进行排序写到输入文件之前,会先将它复制到一个临时文件

•-r 倒置排序的顺序为 由大至小(descending),而非默认的由小至大(ascending)

•-t char 使用单个字符char作为默认的字段分割字符,取代默认的空白字符。

•-u 只有唯一的记录,丢弃所有具有相同键值的记录,只留其中的第一条。只有键值字段是重要的,也就是说:被丢弃的记录其他部分可能是不同值。

•行为模式:sort 会读取指定的文件,如果未给定文件,则读取标准输入,在将排序好的数据写至标准输出。

•-b 忽略开头的空白

•-c 检查输入是否已正确排序,如输入未经排序,但退出码(exit code)为非零值,则不会有任何输出

•-d 字典顺序:仅文字数字与空白才有意义

•-g 一般数值:以浮点数字类型比较字段。这个选项的运作有点类似 -n.差别仅在于这个选项的数字可能有小数点及指数。(仅GNU版本提供此功能)

•-f 以不管字母大小写的方式排序

•-i 忽略无法打印的字符

•-k 定义排序键值字段(该选项后接一个字段编号,或则是一对数字。有时-k之后可用空白分隔。每个编号后都可以接一个点号的字符位置,及/ 或 修饰符(modifier)字母之一.且当出现多个-k选项时候,会先从第一个键值开始排序,找出匹配该键值的记录后,再进行第二个键值字段的排序,以此类推。)

2.4.3.11 uniq命令

  • 功能:删除相邻的重复行,只保留一行

  • 格式:uniq [选项] filename

-c 在输出行前面加上每行在输入文件中出现的次数。

-d 仅显示重复行。

-u 仅显示不重复的行。

2.4.3.12 wc命令

  • 功能:统计给定文件中的行数、字节数和字数。

  • 格式:wc [option] filename

•-c:统计字节数,使用的是UTF-8编码,每个汉字占3个字节,行尾回车占一个字节。

•-l:统计行数

•-w:统计字数

•默认都统计,输出顺序总是行数,字数,字节数

•wc –cl test与wc –lc test是一样的。

2.4.3.13 comm命令

  • 功能:对两个已经排好需的文件进行比较,若没有排序好,则出错。

  • 格式:comm [option] file1 file2

•option:1,2,3控制相应的列是否显示

•-12:表示1,2列不显示,默认都显示

•输出3列:

•第1列:仅在fiel1中出现的行

•第2列:仅在file2中出现的行

•第3列:两个文件都存在的行

2.4.3.14 diff命令

  • 功能:逐行比较两个文本文件,列出其不同之处,不要求实现对文件进行排序。

  • 格式:diff [option] file1 file2

Option

-b:忽略行尾的空格,且字符串中的一个或多个空格都视为相等。

-c:采用上下文输出格式,提供三行上下文。

-C n:采用上下文输出格式,提供n行上下文。

-e:产生一个合法的ed脚本作为输出。

  • 输出格式:如何将file1转变成file2

n1 a n3,n4:a表示增加

n1,n2 d n3:d表示删除

n1,n2 c n3,n4:c表示修改

n1,n2

-12:表示1,2列不显示,默认都显示

n1,n2是针对file1的,n3,n4是针对file2的

每一行后面跟随受到影响的若干行,以”<“开头的行属于file1,”>”开头的行属于file2。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-SrEPsMwT-1585219775432)(/Users/tian.e.y/Library/Application Support/typora-user-images/截屏2020-03-26 17.09.51.png)]

2.5 目录管理

2.5.1 路径名

  • 绝对路径名与相对路径名

路径分量分隔符用斜线/,而不是反斜线\

例如 /usr/stud/liu test/data1/cfg

  • 当前工作目录

当前工作目录是进程属性的一部分,每进程一个

没有逻辑盘的概念

  • 文件.与…

在目录表中确实有两个文件

这两个目录项由系统创建和删除

  • 主目录(Home Directory)

每个用户都有自己独立的主目录 /home/用户名

用env命令查环境变量HOME的值

  • “/”:所有目录的起点,操作系统本身的驻留程序存放在以根目录开始的专用目录中。

  • 主目录:用~表示

2.5.1常用命令

2.5.1.1pwd/cd :打印/改变当前目录

  • pwd命令: 打印当前工作目录
  • cd命令:改变当前工作目录

2.5.1.2 mkdir/rmdir :创建/删除目录

  • 创建目录mkdir

例:mkdir sun/work.d

mkdir除创建目录外,系统自动建立文件.与…

  • 删除目录rmdir

例:rmdir sun/work.d

要求被删除的目录除.与…外无其它文件或目录

2.5.1.3 cp:复制目录

  • cp命令选项–r,递归地复制一个目录

    cp -r dir1 dir2

dir2不存在,则新建子目录,并将dir1下内容拷入

dir2已存在,则将所有文件拷入目录dir2

  • 选项–v,冗长(verbose)方式

复制时列出所拷贝的文件名

  • 选项–u,增量拷贝(update),便于备份目录

根据文件的时戳,不拷贝相同的或者过时的版本的文件,以提高速度

dir1dir2不慎颠倒位置,不会出现灾难性后果

2.5.1.4 find :在目录中查找文件

  • 功能

find命令从指定的查找范围开始,递归地查找子目录,凡满足条件的文件或目录,执行规定的动作

  • 格式: find [搜索路径] [选项] [-print –exec –ok …]

  • 举例

find verl.d ver2.d -name ‘*.c’ -print

查找范围:当前目录的子目录ver1.d 和ver2.d

条件:与名字*.c匹配。注:*.c应当用引号括起

动作:把查找到的文件的路径名打印出来

  • 命令的特点

功能强,选项较多

递归式查找,提供了一种遍历目录树的手段,其它命令经常借用find的“递归式查找”特性

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-y6yhWV3k-1585219775432)(/Users/tian.e.y/Library/Application Support/typora-user-images/image-20200326172807469.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-x1MLEE5C-1585219775433)(/Users/tian.e.y/Library/Application Support/typora-user-images/image-20200326172818084.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ku5Xd8Az-1585219775433)(/Users/tian.e.y/Library/Application Support/typora-user-images/image-20200326172826947.png)]

  • find关于动作的选项

  • -print

打印查找的文件的路径名

  • -exec

对查找到的目标执行某一命令

在-exec及随后的分号之间的内容作为一条命令,{}代表所查到的路径名,最后以;结尾。

  • -ok

与-exec类似,只是对查找到符合条件的目标执行一个命令前需要经过确认

2.6 文件的归档与压缩处理

2.6.1 tar :文件归档

  • 功能

将多个文件或目录打包在一个文件里,便于传输和保持。

  • 命令用法

tar [options] 包名 file-list(待归档文件或目录列表)

  • 选项第一字母指定要执行的操作,是必需的

-c: 创建新的文件。如果用户想备份一个目录或是一些文件,就要选择这个选项。

-f:-f<备份文件>或–file=<备份文件> 指定备份文件名。

-t: 列出备份文件的内容,查看已经备份的文件。

-x:从备份文件中还原文件。

-v:显示指令执行过程。

-z:用gzip来压缩/解压缩文件,加上该选项后可以将文件进行压缩,但还原时也要用该选项进行解压缩。

-r:添加文件到归档包文件的尾部

-C:切换到指定的目录dir

  • 打包,常用参数-cf或-cvf

tar –cf example.tar *

对当前目录下的所有文件进行打包,生成example.tar

tar –cvf example.tar *

打包同时,列出包里的文件

  • 查看包中内容,参数-tf

查看包example.tar内容

​ tar –tf example.tar

  • 还原tar包,常用参数-xf或-xvf

还原example.tar包内容

tar –xf example.tar

tar –xvf example.tar

  • 向包中添加新文件,参数-rf或rvf

将文件file5添加到包example.tar中

tar –rf example.tar file5

  • 用gzip压缩打包文件,参数-czf或czvf

当前目录下的所有文件或目录进行gzip压缩,生成tmp.tar.gz

tar –zcvf tmp.tar.gz *

  • 查看压缩包tmp.tar.gz的内容

tar –ztf tmp.tar.gz

  • 解压缩gzip压缩的包,参数-xzf或xzvf

解压缩tmp.tar.gz包

tar -xzvf tmp.tar.gz

解压缩tmp.tar.gz包到当前目录下的目录b

tar –zxvf tmp.tar.gz –C ./b

  • 目录打包

设work1是一个复杂的有多个层次的子目录

tar cvf work1.tar work1

从归档文件中恢复数据的命令:

tar xvf work1.tar

2.6.2 compress/uncompress:文件压缩和解压缩

  • 命令compress和uncompress

采用LZW算法对文件压缩,是一种字典压缩算法.压缩算法对文件中有规律的数据内容压缩效率很高.普通文本文件可压掉50-80%.有许多空白字段的数据库文件甚至可压掉90%以上.压缩完的文件名后缀是.Z

compress ch5 压缩,生成新文件ch5.Z

zcat ch5.Z 读取压缩格式的文件

uncompress ch.Z 解压缩,还原文件ch5

2.7 硬链接和软链接

文件都有文件名与数据,这在 Linux 上被分成两个部分:用户数据 (user data) 与元数据 (metadata)。用户数据,即文件数据块 (data block),数据块是记录文件真实内容的地方;而元数据则是文件的附加属性,如文件大小、创建时间、所有者等信息。在 Linux 中,元数据中的 inode 号(inode 是文件元数据的一部分但其并不包含文件名,inode 号即索引节点号)才是文件的唯一标识而非文件名。文件名仅是为了方便人们的记忆和使用,系统或程序通过 inode 号寻找正确的文件数据块。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ARsCM7kB-1585219775434)(/Users/tian.e.y/Library/Application Support/typora-user-images/image-20200326180159252.png)]

2.7.1 硬链接

为解决文件的共享使用,Linux 系统引入了两种链接:硬链接 (hard link) 与软链接(又称符号链接,即 soft link 或 symbolic link)。链接为 Linux 系统解决了文件的共享使用,还带来了隐藏文件路径、增加权限安全及节省存储等好处。若一个 inode 号对应多个文件名,则称这些文件为硬链接。换言之,硬链接就是同一个文件使用了多个别名(见 图 hard link 就是 file 的一个别名,他们有共同的 inode)。

硬链接可由命令 link 或 ln 创建。

2.7.1.1 ln: 普通文件的硬连接

格式:ln [option] file link

无选项情况下,建立硬连接。

$ ln chapt0 intro

$ ls -l chapt0 intro

-rw-rw-rw- 2 kc kermit 17935 Dec 12 18:07 chapt0

-rw-rw-rw- 2 kc kermit 17935 Dec 12 18:07 intro

(前面的几项必相同)

$ **ls -**i chapt0 intro

13210 chapt0

13210 intro

chapt0与intro同时存在时,地位完全平等

删chapt0文件,则intro仍存在但link数减1

硬连接,只限于同一文件系统中的普通文件

注意:

不允许对目录用ln命令建立硬连接

一般来说,目录的link数=直属子目录数+2

2.7.2 软链接

软链接与硬链接不同,若文件用户数据块中存放的内容是另一文件的路径名的指向,则该文件就是软连接。

软链接就是一个普通文件,只是数据块内容有点特殊。软链接有着自己的 inode 号以及用户数据块

2.7.2.1 符号链接

符号链接也叫软链接,用特殊文件“符号链接文件”来实现,文件中仅包括了一个路径名

命令ln –s file link

ln -s users_on sym.link

ls -l sym.link

lrwxrwxrwx 1 guest other 8 Jul 26 16:57 sym.link->users_on

类型为l,大小为8字节,文件中只存放users_on字符串

文件的最后一次写时间以后不再变化

一旦建立了符号连接,删除操作删除的是符号连接文件,其它所有操作都将访问符号连接所引用的文件

2.8 文件和目录的权限

用于控制进程对系统中文件和目录的访问

  • 权限的三个级别

文件主,同组用户,其他用户

每个文件有唯一的属主

  • 普通文件的权限

读、写、可执行

2.8.1 chmod命令

  • 功能

改变文件或目录的访问权限

  • 两种方法

文字设定法,数字设定法

  • 文字设定

    chmod [ugoa] [±=] [rwx] 文件名表

    u–user 文件主的权限

    g–group 同组用户的权限

    o–other 其他用户权限

    a–all 所有上述三级权限

r(Read,读取):对文件而言,具有读取文件内容的权限;对目录来说,具有浏览目录的权限。
w(Write,写入):对文件而言,具有新增,修改,删除文件内容的权限;对目录来说,具有新建,删除,修改,移动目录内文件的权限。
x(eXecute,执行):对文件而言,具有执行文件的权限;对目录了来说该用户具有进入目录的权限。

+ 表示增加权限、- 表示取消权限、= 表示唯一设定权限。

  • 数字形式(八进制数字)

chmod abc file
其中a,b,c各为一个数字,分别表示User、Group、及Other的权限。

例:chmod 674 xyz1 xyz2

八进制: 6 7 4

二进制: 110 111 100

权限: rw- rwx r–

注: 只允许文件主和超级用户修改文件权限

2.8.2 umask命令

  • 功能:决定文件/目录的初始权限,而umask值则表明了需要从默认权限中去掉哪些权限来成为最终的默认权限值。

用vi新建文件

用输出重定向创建文件

创建新目录

umask是进程属性的一部分

umask是shell内部命令

umask是进程属性的一部分

命令

umask 打印当前的umask值

umask 022 将umask值设置为八进制的022

  • 掩码值的含义

普通文件:rw权限受影响,初始权限中无x权限

目录文件:rwx权限均受掩码值影响

例:掩码值: 022

二进制: 000010010

普通文件: rw-r–r--

目录: rwxr-xr-x

3 Linux开发工具

3.1 编辑器vi/vim的使用

所有Linux系统都会内置vi文本编译器,其他的工具不一定会存在.

很多软件的接口会主动call vim

vim具备程序编辑能力,程序简单,速度相当快.

图片网盘链接:

链接:https://pan.baidu.com/s/1gT59cdO_HqXQp8dvvSGgzw 密码:79m3

3.2 gcc的使用

3.2.1 gcc概述

  • gcc: GNU编译套件

gcc是由GNU开发的编程语言编辑器,包括C,Cpp,object-c,fortrran,java,ada,golang.

3.2.2 gcc编译流程分析

  • 基本语法

gcc [option] [filename]

Linux系统(简介、文件管理、常用命令、账号管理、c开发工具)_第1张图片

  • 基本流程
    在这里插入图片描述
    Linux系统(简介、文件管理、常用命令、账号管理、c开发工具)_第2张图片

3.2.3 举例

  • 准备

编写代码:创建test.c ,并写入(此时代码包含错误):

#include

void main(){

scanf(“%d”, a);

printf(“a = %d\n”, a);

}

  • 预处理

输入:编写的文件*.c

输出:中间文件*.i

命令:

gcc -E test.c -o test.i

提示错误

头文件不对

  • 编译阶段

输入:中间文件*.i

输出:汇编语言文件*.s

功能:检查语法错误

命令:

gcc -S test.i -o test.s

提示错误

  • 汇编阶段

输入:汇编语言文件*.s

输出:二进制机器码*.o

命令:

gcc -c test.s -o test.o

选项-c:使编译器完成汇编阶段就停止

  • 链接阶段

输入:二进制机器代码文件*.o

输出:可执行的二进制文件

命令:

gcc test.o -o test

运行./test即可执行程序

  • 一次性编译

gcc [编译文件] -o [目标文件]

gcc test.c -o test

3.2.4 多文件编译

gcc other1.c other2.c app.c -o app

但我们更倾向于通过增加头文件的方式来进行多文件编译.

Linux系统(简介、文件管理、常用命令、账号管理、c开发工具)_第3张图片

3.2.5 Linux库的创建与使用

3.2.5.1 什么是库?

1. 库:事先已经编译好的代码,经过编译后可以直接调用的文件,本质上来说是一种可执行代码的二进制形式,可以被操作系统载入内存执行。

2. 系统提供的库的路径

/usr/lib

/usr/lib64

3.Linux库文件名的组成

前缀(lib)+库名+后缀(.a静态库;.so动态库)

libmm.a:库名为mm的静态库;

libnn.so:库名为nn的动态库。

静态库与动态库

载入的顺序是不一样的

(1)静态库的代码在编译时就拷贝到应用程序中,因此当有多个程序同时引用一个静态库函数时,内存中将会调用函数的多个副本。由于是完全拷贝,因此一旦连接成功,静态库就不再需要了,代码体积大。

(2)动态库在程序内留下一个标记,指明当程序执行时,首先必须要载入这些库。在程序开始运行后调用库函数时才被载入,被调用函数在内存中只有一个副本,代码体积小。

3.2.5.2 静态库的创建和使用

  • 静态库创建步骤

    • 在头文件中声明静态库导出的函数
    • 在源文件中实现静态库所导出的函数
    • 编译源文件,生成目标文件
    • 通过命令ar将目标文件加入到静态库中
    • 将静态库拷贝到系统默认的存放库的路径(usr/local/lib),或指定的路径下
  • 静态库的使用

    • 编译文件

      gcc -o app app.c -L./ -lother1 -lother2

Linux系统(简介、文件管理、常用命令、账号管理、c开发工具)_第4张图片

  • 项目结构
    • include 存放头文件
    • src 存放源代码
    • lib 存放库文件

Linux系统(简介、文件管理、常用命令、账号管理、c开发工具)_第5张图片

采用标准文件模式

Linux系统(简介、文件管理、常用命令、账号管理、c开发工具)_第6张图片

将编译得到的二进制文件拷贝到其他主机,程序可以运行.

3.2.5.3 动态库的创建和使用

  • 动态库的创建步骤

    • 在头文件中声明动态库所导出的函数
    • 在源文件中实现动态库所导出的函数
    • 编译源文件,生成与位置无关的目标文件

    gcc -fPIC *.c -I …/include -c

    • 创建动态库

      gcc -shared -o libtest0x00.so *.o

  • 动态库的使用

    • 相对路径

      gcc app.c -I include ./lib/libtest0x00.so -o app

  • 解决找不到路径的方法

  • 更新LD_LIBRARY_path = 临时作用

  • 配置环境变量

  • 将动态库拷贝至usr/lib

  • 将动态库的绝对路径写入/etc/ld.so.conf文件

    使用ldconfig命令更新

3.3 调试器gdb的使用

3.3.1 gdb介绍

gdb是GNU开源组织发布的一个用于Unix/Linux的程序调试工具。与其它调试器一样,gdb可以在程序中设置断点、查看变量值,跟踪程序执行的过程。利用调试器的这些功能可以方便地找出程序中存在的非语法错误。

编译并运行该程序

gcc -g test.c -o test

gdb的启动和退出

启动:

gdb [程序名]

gdb test

gdb --quiet

(gdb)file test

退出

(gdb)quit

gdb的help命令

3.3.2 调试器gdb的使用

  1. 显示程序源代码list

list: 输出从上次调用list命令开始向后的10行程序代码**

list -: 输****出从上次调用list命令处向前10行代码

list n: 输出n行附近的10行代码

list [函数名]: 输出函数附近的10行代码

list n1,n2: 显示第n1行到n2行的代码

2.搜索字符串

forward/search [字符串]: 从当前位置向后查找指定的字符串所在的程序行,查找时不包括当前行,可以用list n,n将当前行设置为n

reverse-search [字符串]: 从当前行向前查找第一个匹配的字符串

  1. 执行程序

在shell环境下使用gdb test,或在gdb环境下使用file test只是载入了程序,但是程序是没有运行的

  1. 运行:

(gdb)run

设置断点

以行数设置断点,格式: break n

功能: 当程序运行到指定行时,会暂停执行,指定行的代码不执行

以函数设置断点

格式: break [函数名]

以条件表达式设置断点

格式: break [行号或函数名] if [条件]

功能: 程序在运行过程中,满足设定条件时,程序在所设置处中断

含义: 当程序执行到第7行时,判断条件i==99是否成立,若成立则中断

以条件表达式变化设置断点

格式: watch [条件表达式]

功能: 程序在运行过程中,当满足设定条件时,程序中断

注意:watch必须在程序运行的过程中设置观察点,即运行run之后,并且要保证条件表达式中的变量已经使用过。

调试器gdb的使用

查看断点

查看当前设置的断点

格式: info breakpoints

管理断点

使中断失效或有效

失效: disable [断点编号]

有效: enable [断点编号]

删除断点

clear [行号]: 删除此行的断点

delete [断点编号]: 删除指定编号的断点, 若有一次删除多个断点,各断点编号以空格分开。

delete: 删除程序中所有的断点

查看和设置变量的值

当程序执行到中断点暂停时,往往需要查看变量或表达式的值,借此了解程序的执行状态,进而发现问题。

print命令

功能: 打印变量或表达式的值,还可以用来对某个变量进行赋值。

print [变量或表达式]: 打印变量或表达式的值

print [变量]=[值]: 对变量进行赋值

whatis

功能: 用于显示某个变量或表达式的数据类型

格式: whatis [变量或表达式]

set

功能: 给变量赋值

格式: set variable [变量]=[值]

控制程序的执行

当程序执行到指定的中断点时,完成相关的debug操作后,可以让程序继续运行

continue

程序继续运行,直到下一个断点或运行完毕

kill

结束当前程序的调试

next/step

功能: 一次一条执行程序代码

区别: next把函数调用当做一条语句来执行;step追踪进入函数,一次一条地执行内部代码。

3.4 工程管理器make的使用

代码编程可执行文件,叫做编译(compile);在一个项目中,先编译这个,还是先编译那个(即编译的安排),叫做构建(build)。make是最常用的构建工具,诞生于1977年,主要用于C语言想项目。实际上,任何只要某个文件发生变化,就要重现构建的项目都可以用make构建。

3.4.1 make的概念

make: 制作。比如,要做出文件a.txt,就可以执行:

$ make a.txt

make本身不知道如何做出a.txt,需要告知make如何调用其它命令完成这个目标。比如,假设文件a.txt依赖于b.txt和c.txt,是后面两个文件连接(cat命令)的产物。那么,make需要知道下面的规则:

a.txt: b.txt c.txt

cat b.txt c.txt > a.txt

也就是,make a.txt这条命令的背后实际分为两步:确认b.txt和c.txt必须已经存在;使用cat命令将两个文件进行合并,输出为新的文件。像这样的规则,需要写在一个名为Makefile的文件中,make命令依赖这个文件进行构建。Makefile也可以写成makefile,或者用命令行参数指定为其它文件名:

$ make -f rules.txt

$ make --file=rules.txt

make只是一个根据指定的Shell命令进行构建的工具。

3.4.2 Makefile的文件格式

Makefile文件由一系列规则构成。每条规则的形式如下:

**[tab] **

目标: 前置条件

[必须有个table键] <命令>

“目标”是必须的;“前置条件”和“命令”是可选的,但两者必存其一。明确:构建目标的前置条件是什么,以及如何构建。

  • 目标(target)

一个目标(target)构成一个规则。目标通常是文件名,指明命令所要构建的对象,比如a.txt。

目标可以是一个文件名,也可以是多个文件名,之间用空格分隔。

除了文件名,目标还可以是某个操作的名字,这称之为“伪目标”(phony target)。

clean:

rm *.o

上面代码的目标是clean,不是一个文件名,是一个操作的名字,属于“伪目标”,作用是删除文件。

$ make clean

为了避免这种情况,可以声明clean是“伪目标”:

.PHONY: clean

clean:

rm *.o

声明clean是“伪目标”之后,make不会去检查是否存在一个叫做clean的文件,而是每次运行都执行对应的命令。如果make命令运行时没有指定目标,默认会执行Makefile文件的第一个目标。

  • 前置条件(prerequisites)

前置条件通常是一组文件名,之间用空格分隔。它指定了“目标”是否重新构建的判断标准: 只要一个前置文件不存在,或者更新过,“目标”就需要重新构建。

result.txt: source.txt

cp source.txt result.txt

构建result.txt的前置条件时source.txt。如果当前路径下,source.txt已经存在,那么make result.txt可以正常运行;否则必须再写一条规则,用以生成source.txt。

source.txt:

echo “this is the source” > source.txt

source.txt没有前置条件,意味着跟其它文件无关,只要source.txt不存在,每次调用make source.txt,都会生成source.txt。

连续执行两次make result.txt。

第一次会先创建source.txt,再创建result.txt。

第二次执行,make发现source.txt没有更新,就会不执行任何操作。

  • 命令(command)

命令(command)表示如何更新目标文件,由一行或多行Shell命令组成;

是构建“目标”的具体指令;

结果通常是生成目标文件。

每行命令之前必须有一个tab键。如果想用其它键,可以用内置变量.RECIPEPREFIX声明。

.RECIPEPREFIX=>

all:

>echo 123

用.RECIPEPREFIX指定大于号(>)替代tab键。

每行命令都是在一个单独运行的Shell中执行的,这些Shell间没有继承关系。

4.Linux账号管理

4.1 Linux账号与组群

4.1.1 用户标识符:UID与GID

每个Linux用户至少会取得两个ID

使用者ID : UserID

组群ID :GroupID

/etc/passwd和/etc/group中找到UID/GID对应的账号

4.1.2 用户账号

  • 登录系统,利用tty1~tty6的终端,输入账号密码

    • 系统在/etc/passwd中查找是否有你的账号,没有则退出,有则读出UID和GID
    • 核对密码 /etc/shadow
    • 进入shell
  • /etc/passwd文件结构

    • 每一行代表一个账号
    • 账号名称 密码 UID GID 用户信息说明栏 家目录 shell
  • /etc/shadow文件结构

    • 账号名称 密码 最近修改密码的日期 密码不可被修改的天数 密码需要重新修改的天数 密码过期后宽限的日期 账号失效日期 保留

4.1.3 用户组

  • /etc/group文件结构
    • 组名 用户组密码 GID 此用户组支持的账号名称

4.2 账号管理

4.2.1 新增与删除用户

  • useradd 建立账户

    • useradd -u UID -g 初始用户组 -G 次要用户组 -mM -c 说明栏 -d 家目录绝对路径 -s shell 使用者账户名
  • passwd 设置密码

    • passwd --studin 账号名称
  • chage 列出详细的密码参数

    • chage 账户名
  • usermod 账号数据微调

  • userdel 删除用户

4.2.2 用户身份切换

  • su命令 身份切换

    • su -lm -c 命令 username
    • 切换为root,最好使用su -
  • sudo

    • sudo -b -u 新使用者账号

4.2.4Linux主机上的用户信息传递

  • w , who , last , lastlog 查询用户
    • w , who 查询现在登陆的账户
    • last 所有登陆者的信息
    • lastlog 每个账号最近登陆的时间

你可能感兴趣的:(linux)