linux学习笔记


更新中

自学部分:


一、操作系统概述

计算机由硬件和软件组成
操作系统是软件的一类,主要作用是协助用户调度硬件工作,充当用户和计算机硬件之间的桥梁
图形化:使用系统提供的图形化页面,以获得图形化反馈的形式去使用操作系统
命令行:使用操作系统提供的各种命令,以获得字符反馈的形式去使用操作系统

FinalShell
下载地址:https://www.hostbuf.com
注意:如果虚拟机重启IP地址可能会发生变化,需要重新设置IP地址(或设置固定IP地址)
通过该软件可以在主机上对虚拟机终端进行操作

虚拟机快照(VMware)
对虚拟机进行快照,当虚拟机出现问题后可以用之前的快照进行恢复,从而恢复到之前快照时的状态
注意:快照最好关闭虚拟机进行,否则制作快照过程会很慢

二、Linux基础命令

1、目录结构

Linux系统的目录结构是一个树型结构,没有盘符概念,只有一个根目录/,所有文件都在它下面
“/”出现在开头,表示根目录,“/”出现在语句中,表示层次关系

2、基础命令

(1)命令的通用格式

1
commard [-options] [parameter]

command:命令本身
-options:[可选,非必填]命令的一些选项,可以通过选项控制命令的行为细节
parameter:[可选,非必填]命令的参数,多用于命令的指向目标

(2)ls命令

ls命令的作用是列出目录下的内容

1
ls [-a -l -h] [Linux路径]

参数:
-a -l -h是可选的选项
-a:all的意思,即列出全部文件(包含隐藏文件/文件夹)
-l:以列表(竖向排了)的形式展示内容,并展示更多信息
-h:表示易于阅读的形式,列出文件大小,入K、M、G(-h必须和-l一起使用)
注:
以“.”开头,表示时Linux系统的隐藏文件/文件夹
选项组合在一起使用时可以只写开头的“-”,其他的可以忽略(如:al,la,alh)
Linux路径是此命令可选的参数
当不使用参数时,直接使用ls命令本体表示:以平铺形式,列出当前工作目录下的内容
当使用参数时,ls命令的参数表示:指定一个Linux路径,列出制定路径的内容

3、目录切换命令

(1)cd命令可以更改目录

1
cd [Linux路径]

cd命令无参数,表示回到HOME目录
cd命令有参数,表示要切换到那个目录下

(2)pwd命令:打印当前工作目录

4、相对路径和绝对路径

绝对路径:以根目录为起点,描述路径的一种写法,路径以“/”开头
相对路径:以当前目录为起点,描述路径的一种写法,路径无需以“/”开头(常用)
特殊路径表达符:
“.”:表示当前目录
“..”:表示上一级目录
“~”:表示HOME目录

5、目录创建命令

mkdir命令用于创建新的目录(文件夹)

1
mkdir [-p] Linux路径

参数必填,表示Linux路径,即要创建的文件夹路径,相对路径或绝对路径均可
参数:
-p:可选,表示自动创建不存在的父目录,适用于创建连续多层级的目录

6、文件操作命令

(1)touch命令:创建文件

1
touch linux路径

(2)cat命令:查看文件内容,将文件内容全部显示出来

1
cat Linux路径

(3)more命令:查看文件内容,more支持翻页,可以一页页的展示

1
more Linux路径

查看过程中,通过空格进行翻页,通过“q”退出查看

(4)cp命令:复制文件、文件夹

1
cp [-r] 参数1 参数2

参数:
-r:用于复制文件夹使用,表示递归
参数1:Linux路径,表示非复制文件或文件夹
参数2:Linux路径,表示复制要去的地方

(5)mv命令:移动文件、文件夹

1
mv 参数1 参数2

参数:
参数1:Linux路径,表示被移动文件或文件夹
参数2:Linux路径,表示要移动去的地方,如果目标不存在,则进行改名,确保目标存在
注:如果需要移动文件夹,需要文件夹为空

(6)rm命令:删除文件、文件夹

1
rm [-r -f]参数1 参数2 ...参数N

参数:
-r:用于删除文件夹
-f:表示force,强制删除(不会弹出提示信息)
注:普通用户删除不会弹出提示,只有root管理员用户删除内容会有提示
参数1、参数2…参数N:表示要删除的文件或文件夹,按空格隔开
通配符:“”:表示通配符,即匹配任意内容(包含空)
test
:表示匹配任何以test开头的内容
*test:表示匹配任何以test结尾的内容
test:表示匹配任何包含test的内容

7、查找命令

(1)which命令:查看所使用的一系列命令的程序文件存放在哪里

1
which 要查找的命令 

(2)find命令:按文件名查找指定文件

1
find 起始路径 -name “被查找文件名”

通配符:“”:表示通配符,即匹配任意内容(包含空)
test
:表示匹配任何以test开头的内容
*test:表示匹配任何以test结尾的内容
test:表示匹配任何包含test的内容

(3)find命令:按文件大小查找文件

1
fing 起始路径 -size +|-n[kmg]

参数:
+、-:表示大于和小于
n:表示大小数字
kmg:表示大小单位,k(小写)表示kb、M表示MB、G表示GB

8、grep、wc和管道符

(1)grep命令:从文件中通过关键字过滤文件行

1
grep [-n] 关键字 文件路径

参数:
-n:可选,表示在结果中宣誓匹配的行
关键字:必填,表示过滤的关键字,带有空格和特殊符号,建议用“”将关键字包围起来
文件路径:必填,表死后要过滤的文件路径,可作为内容输入端口

(2)wc命令:统计文件的行数、单词数量等

1
wc [-c -m -l -w] 文件路径

参数:
-c:统计bytes数量
-m:统计字符数量
-l:统计行数
-w:统计单词数量
文件路径:被统计的文件,可作为内容输入端口

(3)管道符:“|”:将管道左边命令的结果作为右边命令的输入(可嵌套)

1
cat test.txt | wc -l

9、echo、tail和重定向符

(1)echo命令:在命令行输出知道内容

1
echo 输出的内容

复杂可用“”包围输出的内容

(2)反引号“”:被“”包围的内容会被作为命令执行,而非不同字段

(3)重定向符“>”和“>>”:

“>”:将左侧命令的结果,覆盖写入右侧指定的文件中
“>>”:将左侧命令的结果,追加写入右侧指定的文件中

1
2
echo "hello wprd" > test.txt
echo "hello word" >> test.txt

(4)tail命令:可以查看文件尾部内容,跟踪文件的最新更改

1
tail [-f -num] linux路径

参数:
-f:表示持续跟踪
-num:表示查看尾部多少行,不填默认10行
文件路径:表示被跟踪的文件路径

10、vi\vim编辑器

vi\vim同图形化界面中的文本编辑器一样,vi是通过命令行对文本文件进行编辑
vim是vi的加强版,兼容vi所有指令,不仅能编辑文本,还具有shell程序编辑功能,可以通过不同颜色的字体来辨别语法的正确性,极大方便了程序的设计和编辑性
(1)命令模式(Command mode):命令模式下,所敲对按键编辑器都理解为命令,以命令驱动不同的功能(此模式下,不能自由进行文本编辑)
(2)输入模式(Insert mode):编辑模式,插入模式,可以对文件内容自由编辑
(3)底线命令模式(Last line mode):以“:”开始,通常用于文件的保存、退出

1
2
vi 文件路径
vim 文件路径

注:
如果文件路径的文件不存在,那么此命令会用于编辑新文件
如果文件路径的文件存在,那么此命令会用于编辑已有文件
通过“vi filename”进入命令模式,通过“i”从命令模式进入编辑模式,通过“esc”从编辑模式进入命令模式,通过“:”从命令模式进入底线命令模式,命令以回车结束运行,通过“wq”退出

快捷键:

模式 命令 描述
命令模式 i 在当前光标位置进入输入模式
命令模式 a 在当前光标位置之后进入输入模式
命令模式 I 在当前行的开头进入输入模式
命令模式 A 在当前行的结尾进入输入模式
命令模式 o 在当前光标的下一行进入输入模式
命令模式 O 在当前光标的上一行进入输入模式
输入模式 esc 任何情况下输入esc都能回到命令模式
命令模式 0 移动光标到当前行的开头
命令模式 s 移动光标到当前行的结尾
命令模式 / 进入搜索模式
命令模式 n 向下继续搜索
命令模式 N 向上继续搜索
命令模式 dd 删除光标所在行的内容
命令模式 ndd n是数字,表示删除当前光标和向下的n行
命令模式 yy 复制当前行
命令模式 nyy n是数字,复制当前行和下面的n行
命令模式 p 粘贴复制的内容
命令模式 u 撤销修改
命令模式 ctrl+r 反向撤销修改
命令模式 gg 跳到首行的开头
命令模式 G 跳到尾行的开头
命令模式 dG 从当前行开始,向下全部删除
命令模式 dgg 从当前行开始,向上全部删除
命令模式 d$ 从当前光标开始,删除到本行的结尾
命令模式 d0 从当前光标开始,删除到本行的开头
底线命令模式 :wq 保存并退出
底线命令模式 :q 仅退出
底线命令模式 :q! 强制退出
底线命令模式 :w 仅保存
底线命令模式 :set nu 显示行号
底线命令模式 :set paste 设置粘贴模式

三、Linux用户和权限

1、root用户(超级管理员)

有系统最大的操作权限

(1)su和exit命令:

1
su [-] [用户名]

参数:
-:可选符号,表示是否在切换用户后加载环境变量,建议带上
用户名:表示要切换的用户,可以省略,省略表示切换到root用户
切换用户后,可以通过“exit”命令返回上一个用户,也可以使用快捷键“ctrl+d”

(2)sudo命令:可以为普通的命令临时以root身份执行

1
sudo 命令

注:并不是所有普通用户都可以使用sudo,需要为普通用户配置sudo认证
在root身份下输入“visudo”命令,在危机最后添加“用户名 ALL=(ALL) NOPASSWD:ALL”通过“wq”保存即可获得sudo认证

2、用户,用户组

(1)Linux系统对权限的管控分为针对用户的权限管控和针对用户组的权限管控

(2)用户组管理(用root用户执行)

1)创建用户组

1
groupadd 用户组名

2)删除用户组

1
groupdel 用户组名

(3)用户管理(用root用户执行)

1)创建用户

1
useradd [-g -d] 用户名

参数:
-g:指定用户组,不置顶-g会创建同名组并自动加入,指定-g需要组已经存在,如存在同名组,必须使用-g
-d:指定用户HOME路径,不指定,HOME目录默认在:/home/用户名
2)删除用户

1
userdel [-r] 用户名

参数:
-r:删除用户的HOME目录,不使用-r,删除用户时,HOME目录保留
3)查看用户所属组

1
id [用户名]

参数:
用户名:如不输入,则查看自身
4)修改用户所属组

1
usermod -aG 用户组 用户名

(4)getent命令

1)查看当前系统中有哪些用户以及用户组

1
getent passwd

查看到的信息:用户名:密码(x):用户ID:组ID:描述信息:HOME目录:执行终端(bash)
2)查看系统中有哪些组

1
getent group

查看到的信息:组名称:组认证(x):组ID

3、查看权限控制

r:表示读权限
w:表示写权限
x:表示执行权限

(1)修改权限控制-chmod命令

只用文件、文件夹的所属用户或root用户才能修改

1
chmod [-R] 权限 文件或文件夹

参数:
-R:对文件夹内的全部内容应用同样的操作

1
chmod u=rwx g=rx o=x test.txt

参数:
u:表示user所属用户权限
g:表示group组权限
o:表示other其他还用户权限
修改后的权限为:rwxr-x–x
权限的数字序号:

0 无任何权限
1 仅有x权限 –x
2 仅有w权限 -w-
3 有w和x权限 -wx
4 仅有r权限 r–
5 有r和x权限 r-x
6 有r和w权限 rw
7 有全部权限 rwx

(2)修改权限控制-chown命令

可以修改文件、文件夹的所属用户和用户组(指适用于root用户)

1
chown [-R]  [用户] [:] [用户组] 文件或文件夹

参数:
-R:对文件夹内的全部内容应用同样的操作
用户:修改所属用户
“:”:用于区分用户和用户组
用户组:修改所属用户组

四、Linux实用操作

1、快捷键

ctrl + c 强制停止
ctrl + d 退出或登出(不能用于vi/vim)
history 查看历史输入过的命令
!命令前缀 自动执行上一次匹配前缀的命令
ctrll + r 输入内容 匹配历史命令
ctrl + a 跳到命令开头
ctrl + e 跳到命令结尾
ctrl + 键盘左键 光标向左跳一个单词
ctrl + 键盘右键 光标向右跳一个单词
ctrl + l 清空终端内容
clear 清空终端内容

2、软件安装

(1)yum命令

RPM包软件管理器,用于自动化安装配置Linux软件,并自动解决依赖问题

1
yum [-y] [install | remove | search] 软件名称

参数:
-y:自动确认,无需手动确认安装或卸载过程
install:安装
remove:卸载
serch:搜索
注:
yum命令需要root权限
yum命令需要联网

(2)apt命令(适用于Ubuntu)

1
apt [-y] [install | remove | search] 软件名称

参数:
-y:自动确认,无需手动确认安装或卸载过程
install:安装
remove:卸载
serch:搜索
注:
apt命令需要root权限
apt命令需要联网

3、systemctl

通过命令对Linux系统中的第三方软件(服务)进行控制:启动、停止、开机自启

1
systemctl start|stop|status|enable|disable 服务名

start:开启
stop:关闭
status:查看状态
enable:开启开机自启
disable:关闭开机自启
NetworkManager:主网络服务
network:副网络服务
firewalld:防火墙服务
sshd,ssh服务

学校课程:


第一章:Linux系统概述

UNIX系统特点

多用户、多任务和分时的操作系统
可以执性好
安全、稳定性好(源码不公开)
具有层次式的文件系统,文件按目录组织,目录构成一个层次结构
文件、设备统一管理
具有功能强大的shell命令
方便系统的调用
有丰富的软件工具和网络功能

适用场合

UNIX一般用于大型网站(Internet)或大型的企、事业单位或局域网上的服务器

Linux系统的特点

采用UNIX的设计理念
与UNIX兼容,源码独立
多任务、多用户、分时的操作系统
性能高,安全、稳定性好
具有丰富的系统调用和工具
免费的自由软件,源码公开
便于定制和再开发

Linux应用场合

被用作中小型局域网服务器的操作系统
嵌入式系统
![Linux笔记-学校课程-第一章- Linux应用场合](img/Linux笔记-学校课程-第一章- Linux应用场合.png)

第二章:Linux Shell基础

shell

shell命令行模式下,用户和UNIX/linux操作系统内核间的接口。它接收用户输入的命令或数据,并解释执行之后,将命令的执行结果在显示器等输出设备上显示出来

shell的作用

接受输入
解释执行接收到的输入信息
输出结构

linux常用的简单命令

解释 Linux命令 命令举例
查看日期 date date
显示日历 cal cal 2023
显示大字 banner banner “ABCD”
计算机 be be
查看谁在使用 who who
查看我是谁 whoami whoami
清除屏幕 clear clear
帮助 man man date
修改口令 passwd passwd

系统注销、关机、重启命令

注销/退出系统:

1
exit

关机(shutdown/hale命令):

1
2
3
4
shutdown -h now(系统立刻关机)
shutdown -h 20:30(系统会在今天20:30关机)
shutdown -h +10(系统会在十分钟后关机)
hale(系统立刻关机)

重启(shutdown/reboot命令):

1
2
3
4
shutdown -r now(系统立刻重启)
shutdown -r 20:30(系统会在今天20:30重启)
shutdown -r +10(系统会在十分钟后重启)
reboot

目录管理

目录结构:

Linux系统采用树型的目录结构。在这种结构中,一个文件的名字是由根目录到该文件路径上的所有结点名按顺序构成的,相互之间用“/”分开,根目录用“/”表示。

常用目录:

/bin 普通用户可执行的linux命令和共用程序
/dev 设备文件
/etc 系统管理命令和数据文件
/lib C程序库
/usr 存放用户的家目录和用户共用程序或文件
/home 普通用户的工作目录

注:目录区分大小写

特殊目录:

/ 表示根目录
. 表示当前目录
.. 表示当前目录的父目录

常用的文件操作命令:

解释 命令 命令举例 类似DOS命令
显示当前目录 pwd pwd cd
改变目录 cd cd /usr cd c:\usr
进入家目录 cd cd
创建目录 mkdir mkdir abc md abc
删除空目录 rmdir rmdir abc rd abc
删除目录及其内容 rm -r rm -r abc delteer abc
显示目录内容 ls ls -l abc dir abc

文件类型:

| 普通文件(ordinary file) | 1、文本文件
2、二进制文件 |
| — | — |
| 目录文件(directory) | |
| 特殊文件(special file) | 1、块设备文件
2、字符设备文件 |
| 符号链接文件(symbolic links) | |
| - | 普通文件 |
| d | 目录文件 |
| b | 块设备文件 |
| c | 字设备文件 |
| l | 符号链接文件 |

注:区分大小写

特殊文件名:

.字符串 表示隐含文件,如“.profile”文件

通配符:

任一个字符,如“abc?”
* 任何字符,如“ab*10”表示以ab开头和以10结尾的名字

文件权限

Linux文件的存取权限

权限 普通文件的存取权限 目录的存取权限
r 具有读取文件的权利 能读文件名称和内容
w 具有写入文件的权限 能修改和删除文件,可以改变文件名
x 具有执行文件的权利 能使用目录下的文件(如cd命令)搜索文件等

用户存取文件类型

用户类型 说明
owner 文件的所有者(创建该文件的用户)
group 文件的所有者所在的组
other 其他用户(非owner和非group)

权限修改命令chmod:

u 所有者(user-owner)
g 与所有者同组的用户(group)
o 其他用户(other)
a 所有人(all)
1
2
3
4
chmod 用户类型+ 文件权限 文件名
chmod u+x filel
chmod u+x,g+x filel

改变文件所有者(必须对文件由write权限才可以改变拥有者)

1
2
chown 所有者 文件名
chown wjm test1

改变文件所在组(必须是文件的拥有者或者supervisor才能改变文件组别的归属)

1
2
chgrp 组名 文件名
chgrp newservice test1

文件管理常用命令

说明 命令 命令举例
创建文件 gedit gedit file1
显示文件属性 ls ls -l
显示文件内容 cat cat file1
拷贝文件 cp cp file1 file2
删除文件 rm rm file2
移动文件 mv mv file file2

find命令:在制定目录及其子目录下查找符合条件的特定文件

1
find 目录名 条件
查找条件
-name filename 查找名为filename的目录
-type x 查找类型为x的文件,x=d目录 x=f普通文件
-user username 查找所有这位username的文件
-size n 查找记录块(字节数)为n的文件
-atime n 查找n天前被访问过的文件
-mtime n 查找n天前被修改过的文件
-exec cmd{} 对查找到符合条件的文件执行cmd命令,{}表示找到的所有文件,{}后要用“\;”结束
-a 查找同时满足多个条件的文件(逻辑与)
-o 查找满足若干条件之一的文件(逻辑或)
-print 显示找到文件及路径名
-inum n 查找指定索引结点号为n的文件

grep命令:按给定的模式在文件中查找信息

1
grep [选项] pattern file

选项:
-v:显示手游不匹配改模式的行
-c:仅显示是匹配该模式的行为
-l:仅显示包含指定模式的文件名
-y:模式不区分大小写

cmp命令:比较两个文件的内容,若内容不同显示两个文件第一次数据不同的位置

1
cmp [参数] 文件名1 文件名2

参数:
-l:若文件内容不同,显示每个不同位置不同字节的内容
-s:屏幕上不显示信息,但会给出cmp命令执行结果的返回值(相同为0,不同为1)

其他常用命令

查看文件系统的磁盘空间使用信息

1
df [选项] [系统文件]

选项:
省略:以k字节为单位显示磁盘使用信息
-h:按照空间大小,分别以K、M、G字节为单位显示磁盘空间使用情况(常用)

管道(|):可以通过管道吧一个命令的输出传递给另一个命令作为输入。

1
命令1 | 命令2

awk(命令信息提取):把文件或命令的执行结果逐行读入,以空格为单位进行分割,按条件提取所需内容

1
2
awk '{条件}' 文件 
命令 | awk ‘{条件}’

wc(统计命令):统计制定文件或命令输出结果中的字节数、字数或行数,并数据统计结果

1
2
wc [参数] 文件名
命令 | wc[参数]

参数:
-c:统计字节数
-W:统计字数
-l:统计行数

file(判断文件类型)

1
file 文件名
text.c C source,UTF-8 Unicode text
/etc/mtab symbolic link to /proc/mounts(符号链接)
p1.sh POSIX shell script,UTF-8 Unicode text executable(shell脚本文件)
/mnt directory(目录)等等

tee命令:把输出的结果保存到文件里,也显示到屏幕上

1
tee -a file1

参数:
-a表示追加到文件末尾,否则将覆盖文件内容

shell命令输入与输出

指shell命令或脚本执行时数据的输入或输出
1)在shell中,输入数据的方式主要有两种:一种是使 用标准输入—键盘,或者指定一个文件作为输入
2)于输出也是一样:标准输出——屏幕,或者指定一个文件作为输出
3)执行命令或脚本时出现了错误,产生的错误提示信息,缺省输出到屏幕上,也可以把这些信息指定到一个文件中。错误信息输出到屏幕上——标准错误输出

echo命令输出信息

使用echo命令可以把要输出的信息写到“”中。当作字符串输出,也可以输出变量的值

1
echo "hello word"
    注:若存在特殊字符,则需要加参数-e

\c 不换行
\t 跳格
\n 换行

1
echo -e “hello word \c”

注:若字符串中出现双引号,碧玺使用反斜杠“\”来使shell忽略他的特殊含义

1
echo "\"/dev/tmt0""

cat命令显示文件内容

1
cat 文件名

注:它不会在文件分页符处停下来,他会显示整个完整文件,如果希望每次显示一页,可以通过管道传递给另一个具有分页显示功能的more命令

1
cat file | more

read命令可以从键盘中读入数据,并将其赋给一个变量

1
read 变量1 变量2 ...

注:
shell之间用空格作为变量之间的分割符
shell讲所有多出的数据赋予给最后一个变量

输入/输出重定向

输出重定向(>和>>)

命令把输出的结果或数据定向到文件中(覆盖)

1
命令>文件名

命令把标准输出定向到文件中(追加)

输入重定向(<和<<)

<命令把输入数据被定向来自于文件

1
命令<文件名

注:
定界符可以是任意字符,大小写不限,最常见的是EOF
shell将两个定界符之间的所有内容都最为输入,遇到最后一个定界符,shell就知道输入结果了

与文件描述有关的重定向

Linux每打开一个文件,会给该文件分配一个数字,这个数字称为文件描述符(≥0),通常都是通过文件名对文件进行操作,也可以通过文件描述符对文件进行操作
特殊的文件描述符和它们通常岁对应的文件名

文件 文件描述符
标准输入(默认键盘) 0
标准输出(默认屏幕) 1
标准错误输出(默认屏幕) 2

将错误信息进行重定向到一个文件中

1
command 2>filemang

合并标准输出和标准错误的重定向

1
2
grep “111” * & >grep.out 或
grep "111" * >grep.out 2>&1

命令执行顺序

&&:

当&&左边的命令返回真(返回0,成功被执行)后,&&右边的命令才能被执行

1
命令1 && 命令2
||:

如果||左边的命令未执行成功,满额就执行||右边的命令(如果这个命令执行失败了||就执行这个命令)

1
命令1 || 命令2

注:&&或||是根据前面命令的返回值(执行结果)来控制其后面的命令的执行,是编写shell脚本时常用的方法

():

如果希望把几个名利合在一起执行,可以用命令分隔符隔开每一个命令,并把所有命令用圆括号()括起来

1
(命令1;命令2;...)

注:很好单独使用这种方法。一般和&&或||结合在一起使用

正则表达式

正则表达式时一个字符模版,它是由一些特殊或不特殊的字符组成的,在文本处理程序中,用于搜索匹配的字符,长根grep命令结合在一起使用

1
grep [参数] 正则表达式 文件名

功能:从文件中搜索匹配指定正则表达式的所有行
组成:
一般字符:没有特殊意义的字符
特殊字符(meta字符):元字符,在正则表达式中有特殊意义
“.”表示任意一个单字符,可以出现在字符串的任意位置
“^”表示在一行的开始查找字符
“$”表示在行尾匹配字符或字符串
空行用“^$”表示
“*”表示任意数量的字符
实验应用“\”屏蔽特殊字符
“[]”表示匹配一个范围或集合,如:[0-9]表示包含0-9中的任意一个数字
注:在[]也可以使用“^”符号,表示否定或不匹配括号里的人,如[^0-9]表示查找不包含数字的行

使用{}控制匹配字符连续出现的次数

字符{n}表示控制匹配字符连续出现n次
字符{n,}表示控制匹配字符最少连续出现n次
字符{n,m}表示控制匹配字符出现的次数在n到m之间

1
A\{2\}B

tr命令:替换或删除字符

1
tr [参数] 字符串<file

参数:
-d:删除指定字符串中所有字符
-s:删除指定字符串中所有重复出现的字符,只保留第一个
-c:删除指定字符串以外的所有字符

tr中特定控制字符
符号 含义 八进制方式
\a Ctrl-G 铃声(发出警告声) \007
\b Ctrl-H 退格符 \010
\f Ctrl-L 换页 \014
\n Ctrl-J 换行 \012
\t Ctrl-I tab键 \011
\v Ctrl-X \030
字符转换
1
2
tr 字符串1(原字符串) 字符串2(目标/要修改成的字符串)<file
命令 | tr 字符串1 字符串2

第三章:Linux Shell编程

Shell脚本概述

shell脚本是基于命令的脚本语言,是由命令,shell变量和控制语句(如if、for、while和case……)等元素构成的文本文件,无需编译和链接,直接由shell解释执行

编写shell脚本格式

1.利用gedit(pluma)或vi编辑器创建脚本,将脚本命名为xxx.sh
2.脚本第一行总是以“#!/bin/bash”开头,他通知系统以下的shell程序使用系统上的bashSHell来解释
3.第二行注释写脚本名,第三行注释写脚本功能(习惯)
注:“#”表示注释行

1
2
3
4
5
6
#!/bin/bash
#showhello.sh
To show hello to somebody
echo - "Enter Your Name:"
read NAME
echo "HEllo,$NAME"

执行shell脚本

1.shell脚本必须要有执行权限

1
2
3
chmod u+x shouhello.sh

chmod +x showhello.sh

2.在当前目录下执行

1
./showhello.sh

shell变量

shell变量:用来存放数据,程序运行期间,其存放的值可以改变
注:shell将变量中保存的信息都当作字符串
shell变量分为本地变量、环境变量、位置变量、特殊变量

本地变量

本地变量只在创建它的shell脚本中有效,如果在shell中启动另一个进程或退出,则无效
注:所有的shell变量都不定义数据类型

定义变量

1.定义变量:变量名=变量值
1.变量名必须以字母或下划线字符开头,其余的可以使字符或字母,数字或下划线字符
2.变量名区分大小写
3.给变量赋值时,等号周围不能有任何空白符
2.引用(使用)变量:在变量名称前加上“$”符号

1
$ str1 或${str1}
显示变量

echo命令可以显示变量的值

1
2
echo $变量名
echo $str
清除变量值

unset命令可以清除变量值

1
2
unset $变量名
unset $str
合并输出变量值(多个变量并排输出)
1
2
3
echo $变量1 $变量2 $变量3 ......

echo ${变量1} ${变量2} ${变量3} ......

环境变量

一般用于系统维护和使用,用于设置用户shell工作环境
用户可以自定义或修改环境变量
环境变量时全局变量,一旦设置,可用于所有用户进程(子进程),而本地变量只用于当前的用户进程
注:shell中所有的用户进程均称为子进程,登录进程称为父进程
环境变量可以在命令行中设置,但用户注销时这些值将消失,因此最好在.profile文件中定义
登录成功后,系统执行两个环境设置文件,第一个时/ect/profile,第二个是.profile,,位于用户家目录下。
注:
系统管理员可以在/etc/profile文件中设置或修改一下环境变量(对所有用户都有效)
普通用户只能在自己家目录下.profile文件中,设置或修改环境变量(当前登录用户有效)
通常,所有环境变量均为大写

系统常用的环境变量

1.HOME:存放当前登录用户的家目录
2.LOGNAME:保存登录名
3.PATH:存放命令或脚本查找的搜索路径
4.SHELL:存放默认shell
5.PS1:存放shell提示符,默认超级用户为“#”,普通用户为“$”,可以使用任何符号作提示符
6.IFS:存放shell指定的缺省的域分隔符,通常缺省的域分隔符是空格、tab键和换行符
注:
系统常用的环境变量,变量名不可以修改,但变量的值可以修改

用户自定义环境变量

1.定义

1
2
3
export 变量名=变量值

变量名=变量值;export变量名

2.显示环境变量

1
2
3
echo $变量名

env

注:
env命令显示所有的环境变量
3.清除环境变量

1
unset 变量名

位置参数变量

是在脚本内使用的一组特殊的内置变量,从命令行接受变量值,传递给脚本使用
通常用$0,$1-$9表示位置参数变量、
$0表示脚本名
$1表示第1个参数变量
………
$9表示第9个参数变量

特殊变量

系统预定义的变量。存放脚本运行时的相关控制信息,用户不能修改其值。
shell共有7个特殊变量

$# 命令行传递到脚本的参数个数
$* 所有向脚本传递的参数,且将所有参数看成一个字符串
$$ 脚本运行时当前进程的ID好
$? 上一条命令执行后的返回值
$@ 所有向脚本传递的参数,将每个位置参数看成单独的字符串(以空格间隔)
$! 后台运行的最后一个进程的进程ID号
$- 上一个命令的最后一个参数

注:
$?可以在命令行或脚本使用,存放上一条命令执行后的返回值,返回值为0意味执行成功,返回值为1则执行失败

替换命令

用命令执行结果给变量赋值

1
2
3
变量名=`命令`

变量名=$(命令列表)

算数运算

算数运算符

+、-、*、/ 四则运算
**、% 幂运算和模运算,取余数
<<、>> 按位左移和按位右移
&、^、| 按位与、按位异或和按位或
=、+=、-=、*=、/=、%=、<<=、>>=、&=、^=、|= 赋值运算
<、>、<=、>=、==、!=、 比较操作符
&&、|| 逻辑与和逻辑或

expr-通用的表达式计算命令

1
expr 参数1 运算符 参数2

注:
表达式中的参数与运算符必须以空格分开
表达式中的运算可以时算术运算、比较运算、字符串运算和逻辑运算
参数可以是数值也可以是变量

1
2
3
4
expr 2 + 5\* 2-3%2 乘法符号必须被转义
expr \(2+8\)\*2-3 括号必须被转义
expr $count +1 参数是变量
expr 13/2

浮点运算

bash只支持整数运算
处理浮点运算需要使用bc命令
bc命令计算所需的数据,可来源于键盘,也可来自于echo命令的输出

1
2
echo "scale=3; 13/2" | bc
n=$(echo "scale=3; 13/2" | bc)

注:scale设定小数精度(小数位数)

printf命令

printf按指定的格式输出数据,一般格式如下

1
2
3
printf format 输出数据
如:
printf "%-9.5f\n"

注:输出数据可以是具体数值,也可是变量
printf命令的格式说明符

c 字符型 g/G 浮点数(自动)
d 十进制整数 o 八进制
e/E 浮点数(科学计数法) s 字符串
f 浮点数(小数形式) x/X 十六进制

format中还可以使用

\a 警铃 \t 水平制表符
\b 退后一格 \v 垂直制表符
\n 换行 \\ 反斜杠
\f 换页 \“ 双引号
\r 回车 %% 百分号

条件测试

条件测试用来判断某个特定条件是否为真。若为真,则返回值为0;否则返回1.通常跟if和while等结构结合使用,根据条件测试的返回值控制程序的流向

文件测试

功能:测试文件是否存在,文件类型,访问权限等

1
2
3
test condition 

[ condition ]

第二种用的较多,使用方括号时,要注意在测试条件两边加上空格
测试结果为真,返回值为0,付哦则为1

1
2
3
test -f file1

[-f file1]
文件测试条件

测试:文件是否存在,文件类型,访问权限等

[ -f 文件名 ] 文件存在且是普通文件时,返回值为0
[ -L 文件名 ] 文件存在且是链接文件时,返回值为0
[ -d 文件名 ] 文件存在且是一个目录时,返回值为0
[ -e 文件名 ] 文件(文件或目录)存在时,返回值为0
[ -s 文件名 ] 文件存在且文件 长度大于0时,返回值为0
[ -r 文件名 ] 文件(文件或目录)存在且可读时,返回值为0
[ -w 文件名 ] 文件(文件或目录)存在且可写时,返回值为0
[ -x 文件名 ] 文件(文件或目录)存在且可执行时,返回值为0

字符串测试

字符串测试一般格式为

1
[ condition ]

测试结果为真,返回值为0,否则为1
如:测试字符串长度是否为0(空串)

1
[ -z 字符串]

注:字符串可以时具体字符串,也可以时变量

字符串测试条件
[ -z string ] 如果字符串string长度为0(空串),返回值为0
[ -n string ] 如果字符串string长度不为0(非空串),返回值为0
[ str1 = str2] 两字符串相等(也可以使用==),返回值为0
[ stri != str2] 量字符串不想等,返回值为0

数值测试

数值测试格式为

1
[ condition ]

测试结果为真,返回值为0,否则为1
如:测试两个数值是否想等

1
[ 数值1 -eq 数值2 ]

注:测试的数值可以是实际的数值,也可是变量

数值测试条件
[ int1 -eq int2 ] int1等于int2时,返回值为0
[ int1 -ne int2 ] int1不等于int2时,返回值为0
[ int1 -gt int2 ] int1大于int2时,返回值为0
[ int1 -ge int2 ] int1大于等于int2时,返回值为0
[ int1 -lt int2 ] int1小于int2时,返回值为0
[ int1 -le int2 ] int1小于等于int2时,返回值为0

测试条件通常用在脚本里,结合if和while这样的控制结果,根据测试条件的返回值,控制程序的流向,执行不同的功能

控制结构

if语句

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
格式1:
if [条件]
then
命令
fi

格式2;
if [条件]
then
命令1
else
命令2
fi

格式3:
if [条件1]
then
命令1
elif[条件2]
then
命令2
else
命令3
fi

截Linux笔记-学校课程-第三章-简单if语句-1
Linux笔记-学校课程-第三章-简单if语句-2

case语句

case语句为多选择语句

1
2
3
4
5
6
7
8
9
10
case 1值 in
模式1)
命令1
;;
模式2)
命令2
;;
*)
命令n
;;

1.取之后面必须为关键字in,每个模式必须以右括号结束
2.取之从模式1开始一次匹配每一个模式,一旦模式匹配,期间所有命令开始执行直至;;
3.如果无一匹配模式,执行*侯面的命令
4.取值可以为变量或常数

Linux笔记-学校课程-第三章-case语句-1
Linux笔记-学校课程-第三章-case语句-2
Linux笔记-学校课程-第三章-case语句-3
Linux笔记-学校课程-第三章-case语句-4
Linux笔记-学校课程-第三章-case语句-5

for循环

1
2
3
4
5
for 变量 in 列表
do
命令
......
done

1.依次从列表中取值赋给变量,执行循环体
2.知道列表为空,循环结束
3.列表中的数据可以是数字、字符串、命令替换和文件名
Linux笔记-学校课程-第三章-for语句-1
Linux笔记-学校课程-第三章-for语句-2
Linux笔记-学校课程-第三章-for语句-3
Linux笔记-学校课程-第三章-for语句-4

while循环

while循环条件为真执行循环体,条件为假不执行循环体

1
2
3
4
5
while 测试条件
do
命令
......
done

Linux笔记-学校课程-第三章-while语句-1
Linux笔记-学校课程-第三章-while语句-2

用while循环从文件中读取数据

while循环常用于从一个文件中读取数据并处理,有数据读进来,就执行循环体,否则救赎循环

1
2
3
4
5
6
7
8
9
10
while read 变量
do
命令
done <文件名

例如:
while read LINE
do
echo $LINE
done < file1

Linux笔记-学校课程-第三章-while语句-3

while循环对文件中读取的内容进行处理

Linux笔记-学校课程-第三章-while语句-4
Linux笔记-学校课程-第三章-while语句-5
Linux笔记-学校课程-第三章-while语句-6
Linux笔记-学校课程-第三章-while语句-7
Linux笔记-学校课程-第三章-while语句-8
Linux笔记-学校课程-第三章-while语句-9

第四章: Linux C编程

Linux C程序开发环境

编辑器:选择gedit(pluma、nano)或vi/vim
编译器:选择GNU C/C++编译器gcc
调试器:广泛使用gdb

程序设计实例(在屏幕上显示“helloworld!”)

1
2
3
4
5
6
利用gedit(pluma)或vi编辑器编写C源程序,命名为*.c
gedit hellworld.c
用gcc编译.c文件,生成可执行文件*.out
gcc helloworld.c -o helloworld.out
执行文件*.out
./helloworld.out
1
2
3
4
5
6
#include<stdio.h>
int main()
{
printf("Hello World!\n");
return 0;
}

文件操作

如文件的创建、打开、读、写、移指针、关闭…

文件的系统调用

系统调用:是操作系统提供给用户的一组“特殊”接口,用户程序通过这组“特殊”接口来获得操作系统内核提供的服务

关于系统调用和库函数

C语言支持一系列的库函数的调用,其中最基础的是studio库函数
常见的库函数如:
ptintf(“%d”,a);
scanf(“%d,%d,%d”,&a,&b,&c);
事实上,库函数只是C语言在较高层次上调用的方式,系统调用是更低层次上的调用,是通过内核提供给用户调用的函数实现的
Linux笔记-学校课程-第四章-文件操作-关于系统调用和库函数-1
系统调用和库函数对于出错的处理也不尽相同。
对于studio库中的函数,出错时返回一个预定义的常量EOF或NULL;许多库函数在出错时常常返回0或-1;有些库函数则返回某种出错的代码。
系统调用的出错处理比较简单,每个系统调用在出错时都返回 –1 ,在调用成功时返回 0 (或某些其他具有特定意义的整数值)。LINUX系统调用把出错代码放在一个名为errno的外部变量中,在程序中包含头文件errno.h,便可以得到具体的错误代码。

系统提供的常用的文件系统调用
函数 作用
creat 创建一个新文件
open 打开(或创建)文件
read 从指定的文件中读数据放到内存中
write 把内存中读数据写入指定的文件中
lseek 把指定的文件指针定位到某个位置
close 关闭文件
mkdir 创建一个新的空目录
truncate 改变文件长度
link和ulink 创建文件链接和删除文件链接
stat 获取文件的状态信息(如文件所有者、大小、索引节点号…)
系统调用 creat
1
2
3
4
5
6
7
8
9
10
11
12
creat() 创建一个新文件
系统调用的声明格式:
int creat(const char *pathname,node_t mode);
系统调用的头文件:
#include<sys/types.h>
#include<sys/stat.h>
#include<fcntl.h>
返回值:若成功为文件描述符,若出错为-1
int creat(const char*pathname,node_t mode);
参数说明:
pathname是创建文件的名字及路径
mode说明该文件的访问权限
参数mode说明
取值 含义
S_IRUSR(0400) 所有者读权限
S_IWUSR(0200) 所有者写权限
S_IXUSR(0100) 所有者执行权限
S_IRWXU(0700) 所有者读、写、执行权限
S_IRGRP(0040) 组成员读权限
S_IWGRP(0020) 组成员写权限
S_IXGRP(0010) 组成员执行权限
S_IRWXG(0070) 组成员读、写、执行权限
S_IROTH(0004) 其他用户读权限
S_IWOTH(0002) 其他用户写权限
S_IXOTH(0001) 其他用户执行权限
S_IRWXO(0007) 其他用户读、写、执行权限
文件描述符

当创建或打开一个文件时,内核向进程返回一个非负整数,这个非负整数就是文件描述符(3-num),之后通过文件描述符就可对文件进行读、写等相关操作。

常用的文件描时符及它们通常所对应的文件名:
文件 文件描述符
标准输入(默认键盘) 0
标准输出(默认屏幕) 1
标准错误输出(默认屏幕) 2
creat()实例

Linux笔记-学校课程-第四章-文件操作-系统调用creat-1

系统调用 open
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
open() 打开(或创建)文件。是对文件进行读/写操作之前,首先要完成的操作
系统调用的声明格式:
-int open(const char *pathname,int oflag);
-int open(const char *pathname,int oflag,mode_t mode);
系统调用的头文件:
#include<sys/types.h> 基本系统数据类型的定义
#include<sys/stat.h> 文件状态信息的定义
#include<fcntl,h> open函数的声明
返回值:若成功为文件描述符,错出错为-1
int open(const char *pathname, int oflag);
int open(const char *pathname, int oflag, mode_t
mode);
pathname是要打开或创建的文件的名字及路径
oflag说明文件打开的方式
mode是变参,仅当创建新文件时才使用,用其说明该新文件的访问权限
oflag参数说明:
O_RDONLY 只读打开
O_WRONLY 只写打开
O_RDWR 读、写打开
O_APPEND 每次都加到文件尾
O_CREATE 若此文件不存在则创建它,此时需要第三个参数
O_EXCL 如同时指定了O_CREAT,且文件存在,此时将出错
O_YRUNC 如果此文件存在,并以读写或只写代开,则文件长度0
        上述打开方式,可选择用一个或多个。若选择多个方式连用,可用“|”隔开
参数mode说明:
取值 含义
S_IRUSR(0400) 所有者读权限
S_IWUSR(0200) 所有者写权限
S_IXUSR(0100) 所有者执行权限
S_IRWXU(0700) 所有者读、写、执行权限
S_IRGRP(0040) 组成员读权限
S_IWGRP(0020) 组成员写权限
S_IXGRP(0010) 组成员执行权限
S_IRWXG(0070) 组成员读、写、执行权限
S_IROTH(0004) 其他用户读权限
S_IWOTH(0002) 其他用户写权限
S_IXOTH(0001) 其他用户执行权限
S_IRWXO(0007) 其他用户读、写、执行权限
系统调用 read

功能:从文件描述符fd所指的文件中读取count个字烦到buf所指向的内存中

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
read() 从文件中读取指定长度的数据放到内存中
系统调用声明格式:
ssize_t read(int fd,void *buf,size_t count);
fd:文件
*buf:内存地址
count:数据长度
系统调用的头文件:
#include<unistd.h>
ssize_t read(int fd,void *buf,size_t count);
返回值:若成功,读到的字节数,若已到文件为为0名若出错为-1
ssize_t 返回值类型,是一个带符号的整数
大于0的字节数
0(表示文件尾端)
-1(出错)
第三个参数size_t是一个不带符号的整数

系统调用 write

功能:write将buf所指内存中的count个字节写入文件描述符fd所指的文件

1
2
3
4
5
6
7
8
9
write() 将内存中的数据写入指定文件
系统调用声明格式:
ssize_t write(int fd,const void *buf,size_t count);
fd:文件
*buf:内存地址
count:数据长度
系统调用的头文件:
#include<unistd.h>
返回值:若成功,已写入的字节数,若出错为-1

对于普通文件,写操作从文件的当前位移量处开始
如果在打开该文件时,指定了O_APPENFD选择项,则在每次写操作之前,将文件位移量设置在文件的当前结尾处。
write出错的一个常见原因是:磁盘已写满或者超过了对一个给定进程对文件长度限制

Linux笔记-学校课程-第四章-文件操作-系统调用write-1

系统调用 lseek

功能:修改当前文件的偏移量,从而实现文件的读、写操作可以在文件的任意位置开始。
当前文件偏移量的作用:
1.规定了从文件什么地方开始进行读、写操作
2.当打开一个文件时,除非指定了O_APPEND标志,否则偏移量默认为0
3.通常,读、写操作结束时,会使文件偏移量在原来的基础上增加读写的字节数

Linux笔记-学校课程-第四章-文件操作-系统调用lseek-1

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
系统调用声明格式:
off_t lseek(int fd,off_t offest,int whence);
fd:文件
offset:偏移量
whence:参考基准
系统调用的头文件:
#include<sys/types.h>
#include<unistd.h>
参数:
fd:open/creat函数返回的文件描述符
offset:偏移的字节数,是相对偏移量;需结合whence才能计算出真正的偏移量,类型off_t;通常情况下是32位数据类型
whence:该参数可以设置为三个常量之一
SEEK_SET:文件的起始位置
(新当前文件偏移量为:距文件开始处的offset字节)
SEEK_CUR:文件的当前位置
(新当前文件偏移量为:原当前文件偏移量+offset(可正可负)字节)
SEEK_END:文件的尾部
(新当前文件偏移量为:当前文件长度+offset(可正可负)字节)
返回值:若成功则返回新的文件位移量,若出错为-1
如:Off_t currpos;
currpos=lseek(fd,40,SEEK_SET);
空洞文件

1.使用lseek函数修改文件偏移量后,当前文件偏移量有肯能大于文件的长度

1
lseek(反对,50,SEEK_END)

2.在这种情况下,对该文件的下一次写操作,将加长该文件

1
write(fd,buf,50)

3.这样文件中形成了空洞,把有空洞的文件称为空洞文件。对空洞区域进行读,均返回0
Linux笔记-学校课程-第四章-文件操作-系统调用lseek-2
Linux笔记-学校课程-第四章-文件操作-系统调用lseek-3
Linux笔记-学校课程-第四章-文件操作-系统调用lseek-4
Linux笔记-学校课程-第四章-文件操作-系统调用lseek-5
Linux笔记-学校课程-第四章-文件操作-系统调用lseek-6

空洞文件的作用

加快写文件的速度
例如迅雷下载文件,如果不允许形成空洞,下载文件时,就只能哦那个一个位置开始写入,直到结束
如果允许形成空洞,可通过lseek函数控制文件的偏移量,从而控制多线程从文件的不同位置并发写入,这样下载速度就快很多
截Linux笔记-学校课程-第四章-文件操作-系统调用lseek-7

系统调用 close

功能:关闭文件,并释放所占用的内核资源。当进程不在使用一个打开的文件时,就应该关闭该文件

1
2
3
4
5
6
系统调用声明格式:
int close(int fd);
返回:若成功为0,若出错为-1
其中fd是一个已经打开的文件的文件描述符
系统调用的头文件
#include<unistd.h>

1.为防止用户忘记使用close函数关闭文件,释放内核资源。
2.当一个进程终止时,系统会自动调用close函数关闭文件(尚未关闭的),释放内核资源。
3.所以有些程序中就省略了调用close函数关闭已打开文件,但应养成关闭文件的习惯。
Linux笔记-学校课程-第四章-文件操作-系统调用close-1
Linux笔记-学校课程-第四章-文件操作-系统调用close-2

系统调用 mkdir

功能:创建一个新的空目录

1
2
3
4
5
6
7
8
系统调用声明形式:
int mkdir(const char *pathname,node_t mode);
参数pathname为需要创建的文件目录的名称;
参数mode为新创建目录的访问权限。
系统调用的头文件
#include<sys/types.h>
#include<sys/stat.h>
返回:若调用成功为0;出错为-1,并设置适当的errno值

Linux笔记-学校课程-第四章-文件操作-系统调用mkdir-1
Linux笔记-学校课程-第四章-文件操作-系统调用mkdir-2

系统调用 truncate

功能:改变文件的长度

1
2
3
4
5
6
系统调用声明形式:
int truncate(const char *pathname,off_t length);
系统调用的头文件
#include<unistd.h>
返回:若调用成功为0;出错为-1,并设置适当的errno值
参数length表示将参数pathname所指定文件截取到的长度

如果该文件先前的字节数比修改后大,那么多出来的数据会被删除;如果其先前的字节数比修改后的小,那么扩展出来的部分作为空字节(“\0”)被读取。
Linux笔记-学校课程-第四章-文件操作-系统调用truncate-1
截Linux笔记-学校课程-第四章-文件操作-系统调用truncate-2
Linux笔记-学校课程-第四章-文件操作-系统调用truncate-3

硬链接

不同的文件名对应同一个inode(索引节点)
Linux笔记-学校课程-第四章-文件操作-系统调用link、symlink、unlink-1

符号链接

存储被连接文件的文件名,实现链接
Linux笔记-学校课程-第四章-文件操作-系统调用link、symlink、unlink-2

功能:对一个已经存在的文件创建一个新的链接(硬链接)文件,链接文件不开新的空间

1
2
3
4
5
6
7
8
系统调用声明形式
int link(const char *oldpath, const char *newpath);
参数:
oldpath:已存在的文件
newpath:创建的新链接文件
返回值:若成功则为0,若出错则为-1
系统调用的头文件:
#include<unistd.h>

注意:
1.普通用户只能给文件创建硬链接,只有超级用户才可以创建指向一个目录的硬链接。其理由是这样做可能在文件系统中形成循环,大多数处理文件系统的功用程序都不能处理这种情况。
2.POSIX1.1允许跨越文件系统创建硬链接

功能:对一个已经存在的文件创建一个新的链接(符号链接)文件

1
2
3
4
5
6
7
8
系统调用形式声明:
int symlink(const char *oldpath, const char *newpath);
参数:
oldpath:已存在的文件
newpath:创建的新链接文件
返回值:若成功则为0,若出错则为-1
系统调用的头文件:
#include<unistd.h>

说明:
1.任何用户都可以给文件创建符号链接,也可以给目录创建符号链接
2.可以跨文件系统创建链接
3.符号链接与硬链接不同,删除源文件(被链接文件),符号链接文件及失效了,而硬链接文件不受影响。

系统调用link和symlink实例

Linux笔记-学校课程-第四章-文件操作-系统调用link、symlink、unlink-3
Linux笔记-学校课程-第四章-文件操作-系统调用link、symlink、unlink-4
Linux笔记-学校课程-第四章-文件操作-系统调用link、symlink、unlink-5
截Linux笔记-学校课程-第四章-文件操作-系统调用link、symlink、unlink-6

功能:删除一个已存在的链接文件,即从文件系统中删除已存在的文件的目录项,并将链接计数减1

1
2
3
4
5
6
系统调用声明格式:
int unlink(const char *pathname);
pathname指定的被删除链接文件
返回值:若成功则为0,若出错则为-1
系统调用的头文件:
#include<unistd.h>

Linux笔记-学校课程-第四章-文件操作-系统调用link、symlink、unlink-7
Linux笔记-学校课程-第四章-文件操作-系统调用link、symlink、unlink-8

系统调用 stat

功能:都是获取指定文件的状态信息

1
2
3
4
5
6
7
系统调用声明格式:
int stat(const char *file_name, struct stat *buf);
系统调用stat将文件file_name的信息存放在stat结构体类型的变量buf中
系统调用的头文件
#include<sys/stat.h>
#include<unistd.h>

stat结构体及成员

这三个函数调用的返回值都存放在一个stat结构体中,该结构体声明如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
struct stat{
dev_t st_dev; /*文件对于的设备号*/
ino_t st_ino; /*索引节点号*/
umode_t st_mode; /*文件类型和访问权限*/
nlink_t st_nlink; /*该文件的链接数量*/
uid_t st_uid; /*文件所有者的用户ID(UID)*/
gid_t st_gid; /*文件所属组的组ID(GID)*/
dev_t st_rdev; /*如果是一个特殊设备文件(如块设备文件、字符设备文件)则指出其所代表的具体设备号*/
off_t st_size; /*文件大小(以字节为单位)*/
unsigned long st_blksize; /*文件系统中块的大小*/
unsigned long st_blocks; /*文件所占的块数*/
time_t st_atime; /*最近一次访问的时间*/
time_t st_mtime; /*最近一次修改的时间*/
time_t st_ctime; /*最近一次状态改变(文件属性)的时间*/
}

Linux笔记-学校课程-第四章-文件操作-系统调用stat-1
Linux笔记-学校课程-第四章-文件操作-系统调用stat-2
Linux笔记-学校课程-第四章-文件操作-系统调用stat-3
Linux笔记-学校课程-第四章-文件操作-系统调用stat-4