Linux高并发服务器开发

Linux系统编程

  • Linux常用命令
    • Bash解析器常用快捷键
      • TAB(按一下,按两下)
      • clear(清屏)
      • 中断进程
      • 遍历输入的历史命令
      • 光标相关操作
      • 字符删除
    • Linux系统相关快捷键
      • 终端打开方式
      • 终端相关快捷键(选中终端使用)
    • Linux内建命令和外部命令
      • 命令类型的查看方法
      • 内建命令(help)
      • 外部命令(help)
    • Linux命令格式
    • 帮助文档查看手册
    • 相对路径和绝对路径
    • 目录相关的命令
      • pwd
      • cd
      • mkdir和rmdir
    • Linux文件类型
      • 普通文件
      • 目录文件
      • 设备文件
      • 管道文件
      • 链接文件
    • 文件相关命令
      • ls
      • 通配符
      • touch
      • cp
      • rm
      • mv
    • 文件内容查看命令
      • cat
      • less
      • head
      • tail
      • du和df (了解)
    • 查找相关命令
      • find
      • grep命令
    • 管道(|)
    • 压缩包管理
      • tar
      • gzip
        • 解压文件到某个目录中
      • bzip2
      • zip和unzip
    • 文件权限管理
      • 访问用户分类
      • 访问权限说明
      • chmod修改权限
        • 用法
      • chown 修改文件所有者
    • 软件安装和卸载
      • 软件包安装
    • 重定向
      • 标准输出重定向
      • 标准错误输出重定向
      • 标准输入重定向
    • 其他命令
      • tree
      • ln(掌握)
  • Linux环境下编写C程序
    • vim介绍
    • vim工作模式
      • 命令模式
      • 编辑模式
      • 末行模式
    • vim教程
    • vim基本操作
      • 打开文件
      • 编辑文件
      • 保存文件
    • vim实用操作
      • 命令模式下的操作
        • 切换到编辑模式
        • 光标移动
        • 复制粘贴
        • 删除
        • 恢复
        • 查找
        • 替换
        • 可视模式
      • 末行模式
        • 保存退出
        • 替换(高级)
        • 分屏
        • 其他用法(扩展)
    • GCC编译器
    • 静态链接和动态链接
      • 静态链接
      • 动态链接
      • 对比
    • 静态库和动态库
      • 静态库的制作
        • 步骤1:将c源文件生成对应的.o文件
        • 步骤2:使用打包工具ar将准备好的.o文件打包为.a文件
      • 静态库使用
      • 动态库的制作
        • 步骤1:生成目标文件
        • 步骤2:生成动态库
        • 步骤3:通过nm命令查看对应的函数
      • 动态库的使用
        • 如何让系统找到动态库
          • 临时设置
          • 永久设置
    • GDB调试器
      • 生成调试环境
      • 启动GDB
        • 设置运行参数
        • 启动程序
      • 显示源代码
      • 断点操作
        • 简单操作
        • 多文件设置断点
        • 条件断点
        • 维护断点
      • 调试代码
      • 数据查看
      • 自动显示
      • 修改变量的值
  • Makefile
    • Makefile的语法规则
      • 一条规则
        • make命令格式
  • Linux文件和系统调用
    • C库中IO函数工作流程
      • 错误处理函数
        • strerror
        • perror
      • 虚拟地址空间
      • 文件描述符和相关配置
        • 查看当前系统允许的最大打开文件个数
      • open和close函数分析
        • open
        • close
        • 举例说明
      • write和read
        • write函数
        • read函数
      • lseek函数
      • 文件操作相关函数
        • stat函数(重点)
  • 进程
  • 进程间通信
  • 进程组和守护进程
  • 线程和线程同步
  • Linux网络编程
  • 网络基础
  • TCP和socket
  • TCP状态转移和IO多路复用
  • 反应堆模型和线程池模型
  • libevent
  • webserver项目

Linux常用命令

命令解析器:交互地解释、执行用户输入的命令,将用户的操作翻译成机器可以识别的语言,完成相应的功能。

用户使用文字操作操作系统—>使用者界面(shell,KDE,application)接受来自用户的命令与内核进行沟通—>内核(控制硬件工作,进程管理等)—>与硬件进行交互。

Bash解析器常用快捷键

在这里插入图片描述
默认解析器为bash,用户输入所有命令通过bash进行解析,然后执行。

TAB(按一下,按两下)

补齐命令
补齐路径
显示当前目录下的所有目录

clear(清屏)

快捷键: ctrl + L

中断进程

ctrl + c 结束进程
ctrl + z 中断进程,此时进程是挂起状态,可以用fg重启前台被中断的进程。

遍历输入的历史命令

从当前位置向上遍历:ctrl + p 或(⬆)
从当前位置向下遍历:ctrl + n 或(⬇)

光标相关操作

移动到头部:ctrl + a
移动到尾部:ctrl + e

字符删除

删除光标前面的字符:Backspace
删除光标后面的字符:ctrl + d
删除光标前面的所有字符:ctrl + u
删除光标后面的所有字符:ctrl + k

Linux系统相关快捷键

终端打开方式

快捷键:Ctrl + Alt + T

终端相关快捷键(选中终端使用)

新建一个终端:ctrl + shift + n
在终端里新建一个标签:Ctrl + shift + T
关闭标签页:Ctrl + d
标签页切换:alt + 1-9
放大终端字体:ctrl + shift + =
缩小终端字体:ctrl + -
全屏:F11

Linux内建命令和外部命令

内建命令:bash中集成的命令。
外部命令:安装外部软件所带的命令。
内建命令比外部命令有更高的执行效率。外部命令执行往往需要fork一个子进程。

命令类型的查看方法

使用type命令查看
Linux高并发服务器开发_第1张图片
没有出现内建的都是外部命令。

内建命令(help)

格式:help + 内建命令
Linux高并发服务器开发_第2张图片

外部命令(help)

格式:外部命令 --help
Linux高并发服务器开发_第3张图片

Linux命令格式

command [-options] [parameter1] …
说明:
command:命令名
[-options]:选项,对命令进行控制,可以省略
[parameter1] …:传递给命令的参数,可以是零个或多个

一般格式:
- + 字母 例如[ -r -p -l]
或者-- + 单词 例如[ --help ]

Linux高并发服务器开发_第4张图片

帮助文档查看手册

终端输入:man man查看手册所有内容
功能键:
b 回滚一屏
f 前滚一屏
Linux高并发服务器开发_第5张图片
用法:
查看第几章的什么命令:
在这里插入图片描述
Linux高并发服务器开发_第6张图片
man -k passwd 搜索关键词passwd
man -f passwd 等价于what is passwd
Linux高并发服务器开发_第7张图片

相对路径和绝对路径

绝对路径:以"/"开头,“/”代表根目录。
在这里插入图片描述
相对路径:指目标目录相对于当前目录的位置。
特殊目录:
. 代表当前目录, .. 代表上一级目录

目录相关的命令

pwd

打印当前工作目录的名字。绝对路径。

cd

cd 切换到当前用户的home目录
cd . 当前目录
cd . . 上一级目录
cd - 进入上一个进入的目录

mkdir和rmdir

mkdir -p 创建递归目录
Linux高并发服务器开发_第8张图片
rmdir 用法和mkdir一样,支持相对路径和绝对路径。

Linux文件类型

Linux对数据文件(.mp3 .jpg)、程序文件(.c .h),设备文件(鼠标、键盘),网络文件(socket)等都抽象为文件,使用统一的方式管理。

颜色 文件类型
白色 普通文件
绿色 可执行文件
红色 压缩文件
蓝色 目录文件
青色 链接文件
黄色 设备文件
灰色 其他文件

普通文件

普通文件是计算机操作系统用于存放数据、程序等信息的文件,一般都长期存放于外存储器(磁盘、磁带等)中。普通文件一般包括文本文件、数据文件、可执行的二进制程序文件等。

在Unix/Linux中可以通过file命令来查看文件的类型。如果file文件后面携带文件名,则查看指定文件的类型,如果携带通配符“*”,则可以查看当前目录下的所有文件的类型。
普通文件 以-开头
在这里插入图片描述

目录文件

Unix/Linux系统把目录看成是一种特殊的文件,利用它构成文件系统的树型结构。
目录文件只允许系统管理员对其进行修改,用户进程可以读取目录文件,但不能对它们进行修改。
每个目录文件至少包括两个条目,“…”表示上一级目录,“.”表示该目录本身。
目录文件 以d开头
在这里插入图片描述

设备文件

Unix/Linux系统把每个设备都映射成一个文件,这就是设备文件。它是用于向I/O设备提供连接的一种文件,分为字符设备和块设备文件。

字符设备的存取以一个字符为单位,块设备的存取以字符块为单位。每一种I/O设备对应一个设备文件,存放在/dev目录中,如行式打印机对应/dev/lp,第一个软盘驱动器对应/dev/fd0。
字符设备 以c开头
在这里插入图片描述
块设备 以b开头
在这里插入图片描述

管道文件

管道文件也是Unix/Linux中较特殊的文件类型,这类文件多用于进程间的通信。
管道文件 以p开头
在这里插入图片描述

链接文件

类似于 windows 下的快捷方式,链接又可以分为软链接(符号链接)和硬链接。

符号链接 以l开头
在这里插入图片描述
套接字 以s开头
在这里插入图片描述

文件相关命令

ls

ls常用参数:
-a 显示指定目录下所有子目录与文件,包括隐藏文件。
-l 以列表方式显示文件的详细信息。
-h 配合-l以人性化方式显示文件大小。

Linux高并发服务器开发_第9张图片
列出的信息说明:
文件类型 所有者权限 组权限 其他用户权限 硬链接数 所有者 所属的组 大小 文件最后的修改时间
Linux高并发服务器开发_第10张图片

通配符

通配符 含义
* 代表文件名中所有字符
ls te* 查找以te开头的所有文件
ls *html 删除以html结尾的所有文件
代表文件名中任意一个字符
ls ?.c 查找 第一个字符随意,后缀名为c的文件
[ ] 将字符括起来,表示可以匹配[ ]中的任意一个字符
[abc] 匹配abc中的任何一个
[a-z] 匹配a到z中的任何一个
[^a-z] 不匹配小写字母

在这里插入图片描述

touch

如果文件不存在,创建新文件。
如果文件存在,更新文件时间。
不能用于文件夹。
在这里插入图片描述
Linux高并发服务器开发_第11张图片

cp

将给定的文件或目录复制到另一个文件或目录中。

选项 含义
-a 该选项通常在复制目录时使用,它保留链接、文件属性,并递归地复制目录,简单而言,保持文件原有属性。
-f 覆盖已经存在的目标文件而不提示,默认覆盖不提示
-i 交互式复制,在覆盖目标文件前给出提示要求用户选择
-r 若给出的源文件是目录文件,将递归复制该目录下所有文件到另一个目录
-rf 强制复制文件夹,不提示

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
Linux高并发服务器开发_第12张图片

rm

可以通过rm删除文件或目录。

选项 含义
-i 交互式删除
-f 强制删除,无提示
-r 递归删除目录下的所有内容

mv

用户可以使用mv来移动文件或目录。

文件内容查看命令

cat

cat将文件内容一次性输出到终端。
-n 给输出的所有行编号。
Linux高并发服务器开发_第13张图片

less

less命令将文件内容分页显示到终端,可以自由上下浏览。

命令 作用
回车 显示下一行
PageDown 显示下一页
ctrl + p 显示上一行
PageUp 显示上一页
q 退出

head

head命令从文件头部开始查看前n行的内容。

head -n 行数 文件名
Linux高并发服务器开发_第14张图片

tail

tail命令从文件尾部向上查看最后n行的内容

du和df (了解)

du查看某个目录的大小
-sh 以K M G为单位,显示指定文件或目录占用的数据块..

df用于检测文件系统的磁盘空间占用和空余情况,可以显示所有文件系统对节点和磁盘块的使用情况。
Linux高并发服务器开发_第15张图片

查找相关命令

find

按文件名查询:- name
find 路径 -name “文件名”

Linux高并发服务器开发_第16张图片
直接查询
在这里插入图片描述

按大小查询:- size
find 路径 -size 范围
Linux高并发服务器开发_第17张图片
直接查询
Linux高并发服务器开发_第18张图片

+是大于 , -是小于。

按文件类型查询:- type
Linux高并发服务器开发_第19张图片
Linux高并发服务器开发_第20张图片

grep命令

Linux系统中grep命令是一种强大的文本搜索工具,grep允许对文本文件进行模式查找。如果找到匹配模式, grep打印包含模式的所有行。

grep -选项 “搜索内容串” 文件名

选项 含义
-v 显示不包含匹配文本的所有行
-n 显示匹配行及行号
-i 忽略大小写

搜索目录需要添加参数:- r
grep -r “查找的关键字” 路径
Linux高并发服务器开发_第21张图片

管道(|)

一个命令的输出可以通过管道做为另一个命令的输入。
在这里插入图片描述
Linux高并发服务器开发_第22张图片

压缩包管理

tar

把一系列文件归档到一个大文件中,也可以把档案文件解开。
格式:tar [参数] 打包文件名 文件

参数 含义
-c 生成档案文件,创建打包文件
-v 列出归档解档的详细过程,显示进度
-f 指定档案文件名称,f后面一定是.tar文件
-x 解开档案文件
-t 列出档案包含的文件

压缩:
Linux高并发服务器开发_第23张图片

解压:
在这里插入图片描述
查看:
在这里插入图片描述

gzip

tar与gzip命令结合使用 实现文件打包、压缩
tar只负责打包文件,不压缩,用gzip压缩tar打包后的文件,扩展名一般为xxxx.tar.gz

格式:gzip [选项] 被压缩文件

选项 含义
-d 解压
-r 压缩

打包和压缩同时进行:
用参数-z指定压缩包格式.gz
比如,打包并压缩目录
Linux高并发服务器开发_第24张图片
在这里插入图片描述
Linux高并发服务器开发_第25张图片

解压文件到某个目录中

Linux高并发服务器开发_第26张图片

bzip2

扩展名为xxx.tar.bz2
压缩用法:tar -jcvf 压缩包包名 文件
解压用法:tar -jxvf 压缩包包名

注意:可以用tar -xvf 文件名 万能解压bzip2 gzip

zip和unzip

通过zip压缩文件的目标文件不需要指定扩展名,默认为zip。
压缩文件:zip -r 目标文件 源文件
解压文件:unzip -d 解压后目录文件 压缩文件
Linux高并发服务器开发_第27张图片

文件权限管理

Linux系统是一个多用户系统,不同的用户处于不同的地位,对文件和目录有不同的访问权限。为了保护系统的安全性,Linux系统除了对用户权限作了严格的界定外,还在用户身份认证、访问控制、传输安全、文件读写权限等方面作了周密的控制。

访问用户分类

可以从以下三种方式限制访问权限:
1.只允许用户自己访问(所有者)
所有者就是创建文件的用户。
2.允许一个预先指定的用户组中的用户访问(用户组)
用户组合成用户组。例如,某一类或某一项目中的所有用户都能够被系统管理员归为一个用户组,一个用户能够授予所在用户组的其他成员的文件访问权限。
3.允许系统中任何用户访问(其他用户)
用户也将自己的文件向系统内的所有用户开放,在这种情况下,系统内的所有用户都能够访问用户的目录或文件。在这种意义上,系统内的其他所有用户就是 other 用户类。

访问权限说明

读权限(r)
对文件而言,读取文件内容。对目录而言,可以浏览目录。
写权限(w)
对文件而言,可以修改文件内容。对目录而言,可以删除、移动目录内的文件。
可执行权限(x)
对文件而言,可以执行文件。对目录而言,可以进入目录。

注意:Linux系统只允许文件所有者或者超级管理员改变文件或目录的权限。

chmod修改权限

chmod修改文件权限有两种格式:字母法与数字法。

字母法:chmod u/g/o/a +/-/= rwx 文件

[u/g/o/a] 含义
u 表示文件所有者
g 表示用户组,文件所有者属于同一组
o 表示其他以外的人
a 表示这三者皆是
+/-/= 含义
+ 增加权限
- 撤销权限
= 设定权限
rwx 含义
r
w
x 可执行
用法

在这里插入图片描述
新创建一个文件,其他用户的权限只有读,这里增加写权限。
在这里插入图片描述
撤销和设定权限。
在这里插入图片描述
数字法:rwx这些权限用数字代替。

r 数字为“4”
w 数字为“2”
x 数字为“1”
- 不具任何权限,数字为“0”

例如:执行 chmod u=rwx,g=rx,o=r filename
等价于执行 chmod 754 filename
在这里插入图片描述
注意:例如chmod -R 777 test/ 递归test目录下所有文件,并更改权限为777。

chown 修改文件所有者

方法:chown 用户名 文件或目录名
Linux高并发服务器开发_第28张图片

软件安装和卸载

Linux高并发服务器开发_第29张图片
删除
sudo apt remove xxx
更新
sudo apt update

软件包安装

linux下的安装包格式为.deb
安装
sudo dpkg -i xxx.deb
卸载
sudo dpkg -r 软件名

重定向

应用场景:将默认输出改到文件中,方便查看。
标准输入 代码0 默认设备为键盘
标准输出 代码1 默认设备为屏幕
错误输出 代码1 默认设备为屏幕

标准输出重定向

在这里插入图片描述
Linux高并发服务器开发_第30张图片
追加的方式输出。
在这里插入图片描述

标准错误输出重定向

在这里插入图片描述

标准输入重定向

cat < file
输入内容写入file。
在这里插入图片描述

其他命令

tree

以目录树方式查看目录的内容

ln(掌握)

ln命令主要用于创建链接文件。
链接文件分为:软链接和硬链接。
软链接:软链接不占用磁盘空间,源文件删除则软链接失效。
硬链接:硬链接只能链接普通文件,不能链接目录。

注意:软链接存储的是链接的文件的地址,此外,如果源文件和链接文件不在同一个目录,源文件最好用绝对路径。

格式: ln -s 源文件 链接文件
Linux高并发服务器开发_第31张图片

硬链接:只能链接普通文件,不能链接目录。
格式: ln 源文件 链接文件
在这里插入图片描述
权限一样,指向同一块内存空间,一个删除不干扰另一个。
Linux高并发服务器开发_第32张图片
Linux高并发服务器开发_第33张图片
Linux高并发服务器开发_第34张图片

readlink命令读取符号链接文件的内容(存储目标文件的路径)。
在这里插入图片描述

Linux环境下编写C程序

vim介绍

Linux高并发服务器开发_第35张图片

vim工作模式

vi有三种基本工作模式:命令模式、文本输入模式(编辑模式)、末行模式。

命令模式

不管用户处于何种模式,只要按一下esc就可进入命令模式。
在该模式下,用户可以输入各种合法的vi命令。

编辑模式

在命令模式下,输入插入命令(i)、附加命令(a)、打开命令(o)、替换命令(s)都可以进入编辑模式,此时vim窗口最后一行会显示插入。
i在光标处插入,a光标自动向后移动一位,o另起一行编辑,光标处字符自动删除

末行模式

末行模式,用户可以对文件进行一些附加处理。
在命令模式下,输入冒号:即可进入末行模式。此时vim窗口状态行会显示:,待用户输入完成按下回车后,自动回到命令模式。

vim教程

打开教程命令:vimtutor
Linux高并发服务器开发_第36张图片

vim基本操作

打开文件

vim filename
如果filename不存在,就新建一个。

编辑文件

在命令模式输入i

保存文件

第一步:esc进入命令模式
第二步:按下shift + zz保存退出

vim实用操作

命令模式下的操作

切换到编辑模式
按键 功能
i 光标当前位置处插入文字
I 光标所在行首插入文字
o 光标下一行插入文字(新行)
O 光标上一行插入文字(新行)
A 光标所在行尾插入文字
s 删除光标后边的字符,从当前位置插入
S 删除光标所在行,从行首插入
光标移动
按键 功能
ctrl + f 向前滚动屏幕
ctrl + b 向后滚动屏幕
gg 到文件第一行行首
G 到最后一行行首
mgg 到指定的m行
0 光标移动到行首
复制粘贴
按键 功能
[n]yy 复制从当前行开始的n行
p 把粘贴板上的内容插入到当前行
删除
按键 功能
[n]x 删除光标后n个字符
[n]X 删除光标前n个字符
D 删除从光标所在到行尾的所有字符
[n]dd 删除从当前行开始的n行
dG 删除光标所在位置到文件尾的所有字符
dgg 删除从文件首到光标所在位置的所有字符
恢复
按键 功能
. 执行上一次操作
100. 执行上一次操作一百次
u 撤销前一个命令
ctrl + r 反撤销
查找
按键 功能
/字符串 从当前位置向下查找
?字符串 从当前位置向上查找
替换

n和N切换查找内容

按键 功能
r 替换当前字符
R 进入替换模式
可视模式
按键 功能
v 按字符移动,选中文本,使用d删除,使用y复制
shift + v 行选
ctrl + v 列选

末行模式

保存退出
按键 功能
:wq 保存退出
:x 保存退出
:w filename 保存到指定文件
:q! 退出,不保存
替换(高级)
按键 功能
: s/abc/123 光标所在行的第一个abc替换为123
: s/abc/123/g 光标所在行的所有abc替换为123
: 1,10s/abc/123/g 一至十行的所有abc替换为123
: %s/abc/123/g 当前文件的所有abc替换为123
分屏
按键 功能
: sp 文件名 当前文件和另一个文件水平分屏
: vsp 文件名 当前文件和另一个文件垂直分屏
: ctrl + w+w 在多个分屏窗口间切换
其他用法(扩展)

Linux高并发服务器开发_第37张图片

GCC编译器

编译命令格式:
gcc [options] file …
g++ [options] file…
在这里插入图片描述
Linux高并发服务器开发_第38张图片
Linux高并发服务器开发_第39张图片

预处理
在这里插入图片描述

编译
在这里插入图片描述

汇编
在这里插入图片描述

链接
在这里插入图片描述
执行
在这里插入图片描述

静态链接和动态链接

静态链接

由编译器在链接时,将库的内容加入到可执行程序中。
优点:对运行环境依赖小,具有较好兼容性。
缺点:
生成的程序比较大,需要更多的系统资源。
库函数有了更新,必须重新编译应用程序。

动态链接

链接器在链接时,仅仅建立与所需库函数之间的链接关系,在程序运行时才将资源调入可执行程序。
优点:
在需要的时候才会调入对应的资源函数。
简化程序的升级,有较小的程序体积。
实现进程之间的资源共享。
缺点:
依赖动态库,不能独立运行。
依赖版本问题严重。

对比

系统默认采用动态链接,如果想采用静态链接编译,加入-static参数。
Linux高并发服务器开发_第40张图片

静态库和动态库

所谓“程序库”就是包含了数据和执行码的文件,不能单独执行,可以作为其他执行程序的一部分来完成某些功能。

静态库的制作

静态库的命名一般分为三部分:

  • 前缀:lib
  • 库名称:自定义
  • 后缀:.a

最终:libxxx.a
Linux高并发服务器开发_第41张图片

步骤1:将c源文件生成对应的.o文件

Linux高并发服务器开发_第42张图片
Linux高并发服务器开发_第43张图片
在这里插入图片描述
在这里插入图片描述

步骤2:使用打包工具ar将准备好的.o文件打包为.a文件

在使用ar时候需要添加参数:rcs

  • r 更新
  • c 创建
  • s 建立索引

在这里插入图片描述

静态库使用

静态库制作完成后,需要将.a和头文件一起发给用户。

假设测试文件为test.c,静态库文件为libtest.a,头文件为add.h和sub.h。
在这里插入图片描述

Linux高并发服务器开发_第44张图片
编译命令:
gcc test.c -L. -I. -ltest -o test
在这里插入图片描述

  • -I(大写):指定头文件在当前目录
  • -L:表示要链接的库所在的目录
  • -l(小写) :表示链接的库的名字,去掉前缀和后缀。

动态库的制作

动态库在程序编译时不会被链接到目标代码中,而是在运行时候才被载入。不同的应用程序如果调用相同的库,内存中只需要有一份该共享库的实例,规避了静态库对空间的浪费。
动态库的命名分为三个部分:

  • 前缀:lib
  • 库名称:xxxx
  • 后缀:so

所以最终名字为:libxxx.so

步骤1:生成目标文件

要加入编译选项: -fPIC(fpic)
在这里插入图片描述

步骤2:生成动态库

在这里插入图片描述

步骤3:通过nm命令查看对应的函数

Linux高并发服务器开发_第45张图片
ldd可以查看可执行文件依赖的动态库
在这里插入图片描述

动态库的使用

当系统加载可执行代码的时候,需要知道所依赖库的名字以及绝对路径,此时就需要系统动态载入器。
在这里插入图片描述
在这里插入图片描述

如何让系统找到动态库
临时设置

重启终端失效。
Linux高并发服务器开发_第46张图片

永久设置

把export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:库路径 ,设置到~/.bashrc或者/etc/profile文件中。
Linux高并发服务器开发_第47张图片

使环境变量生效
在这里插入图片描述

GDB调试器

GNU工具集中的调试器是GDB,该程序是一个交互式工具,工作在字符模式。
GDB主要帮你完成以下四个方面的功能:

  1. 启动程序,可以按照你自定义的要求运行程序,
  2. 可以让被调试的程序在你指定的位置的断点处停止。
  3. 当程序被停住时,可以检查此时你的程序中所发生的事。
  4. 动态的改变程序的执行环境。

生成调试环境

要调试C/C++的程序,我们要把调试信息加到可执行文件中,使用编译器的-g参数可以做到。
gcc -g test.c -o test
g++ -g test.c -o test

Linux高并发服务器开发_第48张图片

启动GDB

命令:gdb 执行文件

设置运行参数

set args 可指定运行时候的参数
show args 查看设置好的参数
在这里插入图片描述

启动程序

run 程序开始执行,如果有断点,停在第一个断点处。
start 程序向下执行一行。
Linux高并发服务器开发_第49张图片

显示源代码

用list打印程序的源代码,默认显示10行。

  • list n:打印第n行的上下文内容
  • list function:显示函数名为function的函数的源程序
  • list:显示当前行后面的源程序
  • list - :显示当前行前面的源程序
  • set listsize n:设置一次显示源代码的行数。
  • show listsize:查看当前默认显示的行数。

断点操作

info b:查询所有断点

简单操作

b设置断点。
b 10:在第十行设置断点
b function:在function函数入口处设置断点。

多文件设置断点
  • b filename:n:在filename的第n行
  • b filename:function:在filename的function入口处
  • b class::function:在类class的function函数入口处
  • b namespace::class::function:在命名空间namespace的类class的function的入口处
条件断点

为断点设置一个条件,我们使用if语句。
Linux高并发服务器开发_第50张图片

Linux高并发服务器开发_第51张图片

维护断点

d 1-3:删除断点号1-3的断点。
dis 1-3:禁用断点号1-3的断点。
ena 1-3:启用断点号1-3的断点。

调试代码

  • run 运行程序,简写为r
  • next 单步跟踪,函数调用不进去,简写为n
  • step 单步跟踪,函数调用进入函数体内,简写为s
  • finish 退出进入的函数
  • until 在一个循环体内单步跟踪时候,可以运行到退出循环体。简写为u
  • continue 继续运行程,停在下一个断点处。简写为c
  • q 退出gdb

数据查看

p 打印变量、字符串、表达式等的值。
p count 打印count的值。

自动显示

可以设置一些自动显示的变量,当程序停住时,或者单步跟踪时,这些变量会自动显示。

  • display 变量名
  • info display 查看display设置的自动显示的信息。
  • undisplay 编号 编号是查看信息时候变量名对应的编号
  • delete display num 删除
  • disable display num 禁用
  • enable display num 启用

修改变量的值

  • ptype a 查看变量a的类型
  • p a 打印变量a的值
  • set var a = xxx 把变量a的值改为xxx

Makefile

一个工程中文件不计其数,按功能、类型、模块分别放在目录中,makefile制定了一系列规则来指定,哪些文件先编译,哪些文件需要重新编译等。
主要解决两个问题:
1.大量代码的关系维护。把代码维护命令以及编译命令放在makefile文件中,然后再用make工具解析此文件自动执行相应命令,可实现代码的合理编译。
2.减少重复编译时间。在改动一个文件的时候,能判断哪些文件需要重新编译,减少时间。

Makefile的语法规则

一条规则

目标:依赖文件列表
命令规则
Makefile基本规则三要素:
1.目标:通常是要产生的文件的名字
2.依赖文件:用来输入从而产生目标的文件
3.命令:make执行的动作

举例说明:
Linux高并发服务器开发_第52张图片
这里有三条规则。
all:依赖test1 test2
test1和test2:没有依赖
命令则都是输出一行话。
Linux高并发服务器开发_第53张图片

make命令格式

make [options] [-f filename] [targets]

[options]

  • -v 显示make版本信息
  • -w 在处理makefile之前和之后显示工作路径
  • -C dir 读取makefile之前改变工作路径至dir
  • -n 只打印执行的命令,不执行
  • -s 只执行但不显示执行的命令

[-f filename]
make默认在工作目录寻找GNUmakefile、makefile、Makefile
-f指定寻找的名字

[targets]
若使用make没有指定目标,默认是实现makefile文件内的第一个目标
指定了要实现的目标,可以是多个,用空格隔开。
在这里插入图片描述

Linux文件和系统调用

系统调用:就是操作系统提供给用户程序调用的一组接口。用户可以通过这组接口来获得操作系统内核提供的服务。

库函数和系统调用的区别
库函数由两类函数组成:
1.不需要调用系统调用:不需要切换到内核态即可完成函数功能,比如字符串操作。
2.需要调用系统调用:需要切换到内核空间,这类函数通过封装系统调用实现功能,比如printf。

C库中IO函数工作流程

Linux高并发服务器开发_第54张图片

错误处理函数

在终端输入man fopen,我们发现fopen的返回值包括一个errno。
在这里插入图片描述
我们使用全局错误码来查看错误类型。

strerror

Linux高并发服务器开发_第55张图片
在这里插入图片描述

perror

Linux高并发服务器开发_第56张图片
Linux高并发服务器开发_第57张图片

虚拟地址空间

每个进程都会分配虚拟地址空间,在32位机器上,该地址空间为4G。
在这里插入图片描述

文件描述符和相关配置

   打开现存文件或者新建文件的时候,系统会返回一个文件描述符,文件描述符用来指定已打开的文件。
   这个文件描述符相当于这个已打开文件的标号,文件描述符是非负整数,是文件的标识,操作这个文件描述符相当于操作这个标识符所指定的文件。
   
   每个进程都有一张文件描述符表,标准输入、标准输出、标准错误输出设备文件被打开,对应的文件描述符0、1、2记录在表中。
   
   在程序运行起来后打开其他文件时,系统会返回文件描述符表中最小可用的文件描述符,并将此文件描述符记录在表中。

Linux高并发服务器开发_第58张图片

查看当前系统允许的最大打开文件个数

Linux高并发服务器开发_第59张图片
修改最大打开文件个数
Linux高并发服务器开发_第60张图片

open和close函数分析

open

Linux高并发服务器开发_第61张图片

#include
#include
#include

int open(const char* pathname,int flags,mode_t mode);
功能:
	打开文件,如果文件不存在则可以创建
参数:
	pathname:文件打开的路径名及文件名
	flag:打开文件的行为标志,必选项O_RDONLY,O_WRONLY,or O_RDWR
	mode:这个参数,只有在文件不存在时有效,指新建文件时指定文件的权限。
返回值:
	失败返回-1
	成功返回打开的文件描述符

flag参数说明:

必选项:
O_RDONLY,只读
O_WRONLY,只写
O_RDWR,读写

可选项,和必选项按位或
Linux高并发服务器开发_第62张图片

close
#include

int close(int fd);
功能:
	关闭已打开的文件
参数:
	fd:文件描述符
返回值:
	成功:0
	失败:-1,并设置errno

当进程结束时候,内核会对所有未关闭的文件调用close。但是如果一个程序长年累月运行(如网络服务器),打开的文件描述符一定要使用后关闭,否则随着打开文件增多,会占用大量文件描述符和系统资源。

举例说明

Linux高并发服务器开发_第63张图片
在这里插入图片描述

write和read

write函数
#include 
size_t write(int fd, const void *buf, size_t count);
功能:
    把指定数目的数据写到文件(fd)
参数:
    fd :  文件描述符
    buf : 数据首地址
    count : 写入数据的长度(字节)
返回值:
    成功:实际写入数据的字节个数
    失败: - 1
read函数
#include 
​
size_t read(int fd, void *buf, size_t count);
功能:
    把指定数目的数据读到内存(缓冲区)
参数:
    fd : 文件描述符
    buf : 内存首地址
    count : 读取的字节个数
返回值:
    成功:实际读取到的字节个数
    失败: - 1

lseek函数


#include 
#include 
​
off_t lseek(int fd, off_t offset, int whence);
功能:
    改变文件的偏移量
参数:
    fd:文件描述符
    offset:根据whence来移动的位移数(偏移量),可以是正数,也可以负数,如果正数,则相对于whence往右移动,如果是负数,则相对于whence往左移动。如果向前移动的字节数超过了文件开头则出错返回,如果向后移动的字节数超过了文件末尾,再次写入时将增大文件尺寸。
​
    whence:其取值如下:
        SEEK_SET:从文件开头移动offset个字节
        SEEK_CUR:从当前位置移动offset个字节
        SEEK_END:从文件末尾移动offset个字节
返回值:
    若lseek成功执行, 则返回新的偏移量
    如果失败, 返回-1

所有打开的文件都有一个当前文件偏移量(current file offset),以下简称为 cfo。cfo 通常是一个非负整数,用于表明文件开始处到文件当前位置的字节数。

读写操作通常开始于 cfo,并且使 cfo 增大,增量为读写的字节数。文件被打开时,cfo 会被初始化为 0,除非使用了 O_APPEND 。

文件操作相关函数

stat函数(重点)

#include 
#include 
#include int stat(const char *path, struct stat *buf);
int lstat(const char *pathname, struct stat *buf);
功能:
    获取文件状态信息
    stat和lstat的区别:
        当文件是一个符号链接时,lstat返回的是该符号链接本身的信息;
        而stat返回的是该链接指向的文件的信息。
参数:
    path:文件名
    buf:保存文件信息的结构体
返回值:
    成功: 0
    失败: -1

struct stat结构体说明:

struct stat {
    dev_t           st_dev;     //文件的设备编号
    ino_t           st_ino;     //节点
    mode_t          st_mode;            //文件的类型和存取的权限
    nlink_t         st_nlink;       //连到该文件的硬连接数目,刚建立的文件值为1
    uid_t           st_uid;     //用户ID
    gid_t           st_gid;     //组ID
    dev_t           st_rdev;        //(设备类型)若此文件为设备文件,则为其设备编号
    off_t           st_size;        //文件字节数(文件大小)
    blksize_t       st_blksize;     //块大小(文件系统的I/O 缓冲区大小)
    blkcnt_t        st_blocks;      //块数
    time_t          st_atime;       //最后一次访问时间
    time_t          st_mtime;       //最后一次修改时间
    time_t          st_ctime;       //最后一次改变时间(指属性)
};

进程

进程间通信

进程组和守护进程

线程和线程同步

Linux网络编程

网络基础

TCP和socket

TCP状态转移和IO多路复用

反应堆模型和线程池模型

libevent

webserver项目

你可能感兴趣的:(Linux编程学习,服务器,linux)