-
GDB单步调节程序
所属栏目:[语言] 日期:2022-07-11 来源:DaWei
《调用GDB调试器的几种方式》一节中提到,借助 next 命令可以控制 GDB 单步执行程序。所谓单步调试,就是通过一行一行的执行程序,观察整个程序的执行流程,进而尝试发现一些存在的异常或者 Bug。 根据实际场景的需要,GDB 调试器共提供了 3 种可实现单步[详细]
-
GDB print和display命令 查视变量的值
所属栏目:[语言] 日期:2022-07-11 来源:DaWei
前面章节中提到,使用 GDB 调试程序,最常用的方法是:单步调试或者断点调试程序,期间通过查看某个变量或者表达式的值,判断当前程序的执行过程是否正确,不断缩小异常或 Bug 位于代码中的范围,最终找到并修复。 对于在调试期间查看某个变量或表达式的值[详细]
-
GDB禁用与删除断点
所属栏目:[语言] 日期:2022-07-11 来源:DaWei
我们知道,GDB 调试器支持 3 种断点,分别为普通断点(用 break 命令创建)、观察断点(用 watch 命令建立)以及捕捉断点(用 catch 命令建立)。并且如果需要的话,我们可以在被调试程序中打多个断点,甚至于 GDB 允许在同一位置打多个断点。 这就产生一[详细]
-
GDB handle命令 信号处置
所属栏目:[语言] 日期:2022-07-11 来源:DaWei
C、C++ 程序中,信号常常作为进程间通信的一种重要手段。举个例子: #include stdio.h #include unistd.h #include signal.h void display(){ printf(http://c.biancheng.net/gdb/); } int main () { pid_t cpid; pid_t ppid; signal(SIGINT,display); if([详细]
-
GDB frame和backtrace命令 检查栈信息
所属栏目:[语言] 日期:2022-07-11 来源:DaWei
当程序因某种异常停止运行时,我们要做的就是找到程序停止的具体位置,分析导致程序停止的原因。 对于 C、C++ 程序而言,异常往往出现在某个函数体内,例如 main() 主函数、调用的系统库函数或者自定义的函数等。要知道,程序中每个被调用的函数在执行时,[详细]
-
GDB编辑及搜索源码
所属栏目:[语言] 日期:2022-07-11 来源:DaWei
本节主要讲解的是在 GDB 内对源文件中的代码进行修改和查找,分别对应 GDB 中的 edit 命令和 search 命令,下面是对这两个命令的详细介绍。 GDB edit命令:编辑文件 在 GDB 中编辑源文件中使用 edit 命令,该命令的语法格式如下: (gdb) edit [location] ([详细]
-
GDB help命令 查看目标命令的详细用法
所属栏目:[语言] 日期:2022-07-11 来源:DaWei
截止到本节,我们接触了大量的 GDB 命令,甚至很多命令还拥有不同的语法格式和参数。这就产生一个问题,如何才能记住它们呢? 实际上,GDB 调试器的开发人员也想到了这个问题。为了降低用户使用 GDB 调试器的学习成本,GDB 提供了 help 命令,它可以帮用户[详细]
-
Makefile伪标准
所属栏目:[语言] 日期:2022-07-11 来源:DaWei
这一个章节我们主要讲的是 Makefile 中的伪目标。所谓的伪目标可以这样来理解,它并不会创建目标文件,只是想去执行这个目标下面的命令。伪目标的存在可以帮助我们找到命令并执行。 使用伪目标有两点原因: 避免我们的 Makefile 中定义的只执行的命令的目[详细]
-
Makefile文件中包括哪些规则
所属栏目:[语言] 日期:2022-07-11 来源:DaWei
想要书写一个完整的 Makefile文件,需要了解 Makefile 的相关的书写规则。我们已经知道了 Makefile 描述的是文件编译的相关规则,它的规则主要是两个部分组成,分别是依赖的关系和执行的命令,其结构如下所示: targets : prerequisites command 或者是 ta[详细]
-
Makefile的工作进程
所属栏目:[语言] 日期:2022-07-11 来源:DaWei
简单了解一下 Makefile 书写规则之后,再来深入研究一下 Makefile 的是怎样工作的?当我们在执行 make 条命令的时候,make 就会去当前文件下找要执行的编译规则,也就是 Makefile 文件。我们编写 Makefile 的时可以使用的文件的名称 GNUmakefile 、makefil[详细]
-
Makefile ifeq ifneq ifdef和ifndef 条件判别
所属栏目:[语言] 日期:2022-07-11 来源:DaWei
日常使用 Makefile 编译文件时,可能会遇到需要分条件执行的情况,比如在一个工程文件中,可编译的源文件很多,但是它们的类型是不相同的,所以编译文件使用的编译器也是不同的。手动编译去操作文件显然是不可行的(每个文件编译时需要注意的事项很多),[详细]
-
Makefile通配符的利用
所属栏目:[语言] 日期:2022-07-11 来源:DaWei
Makefile 是可以使用 shell 命令的,所以 shell 支持的通配符在 Makefile 中也是同样适用的。 shell 中使用的通配符有:*,?,[...]。具体看一下这些通配符的表示含义和具体的使用方法。 通配符 使用说明 * 匹配0个或者是任意个字符 ? 匹配任意一个字符 [[详细]
-
Makefile变量的定义和运用
所属栏目:[语言] 日期:2022-07-11 来源:DaWei
变量对于我们来说是不陌生的,在学习各种编程语言时会经常用到。就拿C语言来说,变量的使用是十分常见的,变量可以用来保存一个值或者是使用变量进行运算操作。Makefile 中的变量也是这样,我们可以利用它来表示某些多处使用而又可能发生变化的内容,不仅[详细]
-
Makefile自主化变量
所属栏目:[语言] 日期:2022-07-11 来源:DaWei
关于自动化变量可以理解为由 Makefile 自动产生的变量。在模式规则中,规则的目标和依赖的文件名代表了一类的文件。规则的命令是对所有这一类文件的描述。我们在 Makefile 中描述规则时,依赖文件和目标文件是变动的,显然在命令中不能出现具体的文件名称[详细]
-
Makefile目标文件搜寻 VPATH和vpath
所属栏目:[语言] 日期:2022-07-11 来源:DaWei
我们都知道一个工程文件中的源文件有很多,并且存放的位置可能不相同(工程中的文件会被放到不同的目录下),所以按照之前的方式去编写 Makefile 会有问题。 我们之前列举的例子,所有的源文件基本上都是存放在与 Makefile 相同的目录下。只要依赖的文件存[详细]
-
Makefile路径搜索使用示例
所属栏目:[语言] 日期:2022-07-11 来源:DaWei
我们了解了一下路径搜索的使用方式,我们再来看一下具体的使用方法。 为了体验实例的效果的更加明显,我们按照源代码树的布局来放置文件。我们把源代码放置在src目录下,包含的文件文件是:list1.c、list2.c、main.c 文件,我们把头文件包含在 include 的[详细]
-
Makefile隐含准则
所属栏目:[语言] 日期:2022-07-11 来源:DaWei
这个章节讲述的是 Makefile 的隐含规则,所谓的隐含规则就是需要我们做出具体的操作,系统自动完成。编写 Makefile 的时候,可以使用隐含规则来简化Makefile 文件编写。 实例: test:test.o gcc -o test test.o test.o:test.c 我们可以在 Makefile 中这样[详细]
-
bind 和connect 函数 绑定套接字并创立连接
所属栏目:[语言] 日期:2022-07-11 来源:DaWei
socket() 函数用来创建套接字,确定套接字的各种属性,然后服务器端要用 bind() 函数将套接字与特定的 IP 地址和端口绑定起来,只有这样,流经该 IP 地址和端口的数据才能交给套接字处理。类似地,客户端也要用 connect() 函数建立连接。 下面的代码,将创[详细]
-
listen和accept函数 使套接字进入监听状态并响应客户端请求
所属栏目:[语言] 日期:2022-07-11 来源:DaWei
对于服务器端程序,使用 bind() 绑定套接字后,还需要使用 listen() 函数让套接字进入被动监听状态,再调用 accept() 函数,就可以随时响应客户端的请求了。 listen() 函数 通过 listen() 函数可以让套接字进入被动监听状态,它的原型为: int listen(int[详细]
-
send recv 和write read 发送数据与接收数据
所属栏目:[语言] 日期:2022-07-11 来源:DaWei
在 Linux 和 Windows 平台下,使用不同的函数发送和接收 socket 数据,下面我们分别讲解。 Linux下数据的接收和发送 Linux 不区分套接字文件和普通文件,使用 write() 可以向套接字中写入数据,使用 read() 可以从套接字中读取数据。 前面我们说过,两台计[详细]
-
socket缓冲区以及阻塞模式说明
所属栏目:[语言] 日期:2022-07-11 来源:DaWei
在《socket数据的接收和发送》一节中讲到,可以使用 write()/send() 函数发送数据,使用 read()/recv() 函数接收数据,本节就来看看数据是如何传递的。 socket缓冲区 每个 socket 被创建后,都会分配两个缓冲区,输入缓冲区和输出缓冲区。 write()/send()[详细]
-
TCP协议的粘包难题 数据的无边界性
所属栏目:[语言] 日期:2022-07-11 来源:DaWei
上节我们讲到了socket缓冲区和数据的传递过程,可以看到数据的接收和发送是无关的,read()/recv() 函数不管数据发送了多少次,都会尽可能多的接收数据。也就是说,read()/recv() 和 write()/send() 的执行次数可能不同。 例如,write()/send() 重复执行三[详细]
-
图解TCP数据报结构以及三次握手 很详细
所属栏目:[语言] 日期:2022-07-11 来源:DaWei
TCP(Transmission Control Protocol,传输控制协议)是一种面向连接的、可靠的、基于字节流的通信协议,数据在传输前要建立连接,传输完毕后还要断开连接。 客户端在收发数据前要使用 connect() 函数和服务器建立连接。建立连接的目的是保证IP地址、端口[详细]
-
详细分析TCP数据的传输步骤
所属栏目:[语言] 日期:2022-07-11 来源:DaWei
此时 Ack 号为 1301 而不是 1201,原因在于 Ack 号的增量为传输的数据字节数。假设每次 Ack 号不加传输的字节数,这样虽然可以确认数据包的传输,但无法明确100字节全部正确传递还是丢失了一部分,比如只传递了80字节。因此按如下的公式确认 Ack 号: Ack[详细]
-
解析TCP四次握手断开连接
所属栏目:[语言] 日期:2022-07-11 来源:DaWei
建立连接非常重要,它是数据正确传输的前提;断开连接同样重要,它让计算机释放不再使用的资源。如果连接不能正常断开,不仅会造成数据传输错误,还会导致套接字不能关闭,持续占用资源,如果并发量高,服务器压力堪忧。 建立连接后,客户端和服务器都处于[详细]


