【牛客网C++服务器项目学习】Day3-GDB、I/O库函数、虚拟内存、文件描述符

30 篇文章 118 订阅
订阅专栏

项目学习地址:【牛客网C++服务器项目学习】

day3

1.GDB

什么是GDB?

  • GDB 是由GNU 软件系统社区提供的调试工具,同GCC 配套组成了一套完整的开发环境,GDB 是Linux 和许多类Unix 系统中的标准开发环境。
  • 一般来说,GDB 主要帮助你完成下面四个方面的功能:
    1.启动程序,可以按照自定义的要求随心所欲的运行程序
    2.可让被调试的程序在所指定的调置的断点处停住(断点可以是条件表达式)
    3.当程序被停住时,可以检查此时程序中所发生的事
    4.可以改变程序,将一个BUG 产生的影响修正从而测试其他BUG

gcc -g -Wall program.c -o program

  • -g 选项的作用是在可执行文件中加入源代码的信息,比如可执行文件中第几条机器指令对应源代码的第几行,但并不是把整个源文件嵌入到可执行文件中,所以在调试时必须保证gdb 能找到源文件。

GDB常用命令(太多了,略,太原始了,现如今的开发接触不到的)

  • list指令,查看代码。在gdb打开的文件中,用list查看代码。可以指定行数,指定函数名,指定文件名等操作。

  • break指令,设置断点。break 行号/函数名/文件名,行号/文件名,函数名

    • 还可以设置条件断点:比如在for循环中,设置断点停在循环变量等于某个值时。
  • info指令,查看断点。

  • delete指令,删除断点。删除的是断点编号。

  • disable指令,失效断点。失效的是断点编号。

如果你有一定的编程经验,你肯定会在IDE中使用过打断点和调试了。现在的vscode、vs早已把GDB的指令集成在GUI上了。但是对于没有图形界面的,例如CentOS操作系统,这种使用命令的GDB调试方法,似乎是唯一的选择。

具体指令,详见下面的截图

img
img

img

2.标准C I/O 和Linux系统I/O函数的对比

这一节算是一个科普介绍向,帮助我们理解C语言中的I/O函数和Linux的I/O函数之间,是一个包含与被包含的关系。C语言的I/O函数是对Linux的I/O进行了一次包装,最大的差异,在于C语言设置了一个缓冲区,每次调用函数写数据时,都是先写入到缓冲区中,只有缓冲区满或者强制刷新缓冲区时,才会把数据写入到磁盘/显示器等

这个图,画的挺好

img

3.虚拟地址空间

Linux系统中的几个地址:

img

虚拟内存是操作系统的内存管理部分的内容,虚拟内存技术的出现是为了解决程序大于内存的问题,可以让操作系统“放大”现在的内存空间,例如,系统本身只有2G的内存,但是通过虚拟内存的地址映射、内存段的换入换出技术,可以实现对4G或者更大的内存空间的操作。(如果大家对如何在Linux系统中,通过虚拟地址寻找物理地址感兴趣的话,可以查看我写的 这篇文章)

一个程序,各部分,在内存中的位置图,画的挺清晰的

img

4.文件描述符

我们知道在Linux系统中一切皆可以看成是文件,文件又可分为:普通文件、目录文件、链接文件和设备文件。在操作这些所谓的文件的时候,我们每操作一次就找一次名字,这会耗费大量的时间和效率。所以Linux中规定每一个文件对应一个索引,这样要操作文件的时候,我们直接找到索引就可以对其进行操作了。

文件描述符(file descriptor)就是内核为了高效管理这些已经被打开的文件所创建的索引,其是一个非负整数(通常是小整数),用于指代被打开的文件,所有执行I/O操作的系统调用都通过文件描述符来实现。同时还规定系统刚刚启动的时候,0是标准输入,1是标准输出,2是标准错误。这意味着如果此时去打开一个新的文件,它的文件描述符会是3,再打开一个文件文件描述符就是4…

Linux内核对所有打开的文件有一个文件描述符表格,表格的大小为1024。(其中前三个被标准输入、标准输出、标准错误占据了。)里面存储了每个文件描述符作为索引与一个打开文件相对应的关系,简单理解就是下图这样一个数组,文件描述符(索引)就是文件描述符表这个数组的下标,数组的内容就是指向一个个打开的文件的指针。

img

上面只是简单理解,实际上关于文件描述符,Linux内核维护了3个数据结构

  • 进程级的文件描述符表

  • 系统级的打开文件描述符表

  • 文件系统的i-node表

一个 Linux 进程启动后,会在内核空间中创建一个 PCB 控制块,PCB 内部有一个文件描述符表(File descriptor table),记录着当前进程所有可用的文件描述符,也即当前进程所有打开的文件。

进程级的描述符表的每一条记录了单个进程所使用的文件描述符的相关信息,进程之间相互独立,一个进程使用了文件描述符3,另一个进程也可以用3。

除了进程级的文件描述符表,系统还需要维护另外两张表:打开文件表、i-node 表。这两张表存储了每个打开文件的打开文件句柄(open file handle)。一个打开文件句柄存储了与一个打开文件相关的全部信息。

系统级的打开文件描述符表:

  • 当前文件偏移量(调用read()和write()时更新,或使用lseek()直接修改)

  • 打开文件时的标识(open()的flags参数)

  • 文件访问模式(如调用open()时所设置的只读模式、只写模式或读写模式)

  • 与信号驱动相关的设置

  • 对该文件i-node对象的引用,即i-node 表指针

文件系统的i-node表:

  • 文件类型(例如:常规文件、套接字或FIFO)和访问权限

  • 一个指针,指向该文件所持有的锁列表

  • 文件的各种属性,包括文件大小以及与不同类型操作相关的时间戳

文件描述符、打开的文件句柄以及i-node之间的关系如下图:

img

这就说明:

  • 同一个进程的不同文件描述符可以指向同一个文件(在一个进程中多次打开同一个文件);

  • 不同进程可以拥有相同的文件描述符;

  • 不同进程的同一个文件描述符可以指向不同的文件(一般也是这样,除了 0、1、2 这三个特殊的文件);

  • 不同进程的不同文件描述符也可以指向同一个文件。

牛客网C++课程)Linux 高并发Web服务器项目实战(带定时检测代码)
02-24
牛客网C++课程)Linux 高并发Web服务器项目实战(带定时检测代码) 技术框架: 1. 线程池 + 非阻塞 socket + epoll + 事件处理的并发模型 2. 状态机解析HTTP请求 3. 心跳机制 4. 简易日志系统 主要内容: 1. 使用 socket 实现服务器和浏览器客户端的通信; 2. 用 epoll 事件检测技术实现 IO 多路复用,提高运行效率; 3. 采用模拟 Proacto r的事件处理模式,利用线程池实现多线程机制,实现高并发通信,减少频繁创建和销毁线程带来的开销;(信号和互斥锁) 4. 主进程负责事件的读写,子线程负责业务逻辑——用有限状态机解析HTTP(GET)请求报文;生成相应的响应报文。 5. 利用链表数据结构实现心跳机制(超时检测处理)。
Linux文件描述符
weixin_34092370的博客
08-17 253
文件描述符是一个简单的整数,用以标明每一个被进程所打开的文件和socket。第一个打开的文件是0,第二个是1,依此类推。Unix操作系统通常给每个进程能打开的文件数量强加一个限制。更甚的是,unix通常有一个系统级的限制。在UNIX/Linux平台上,对于控制台(Console)的标准输入(0),标准输出(1),标准错误(2)输出也对应了三个文件描述符。 对于squid,因...
牛客C++ webserver高并发服务器项目一个月速通 含笔记和课程链接
最新发布
qq_45482740的博客
06-24 452
在远程资源管理器扩展插件中,ssh的设置-C盘users里的config文件,进行修改,host随便的名称,hostname是ip地址,user是用户名,保存后左侧会有远程连接的选项,在新窗口打开。在.ssh目录下创建authorized_keys文件,将主机的公钥复制进去。GCC编译成可执行文件,直接gcc test.c的话只会生成.out文件,也能运行。新建会话,输入在linux中利用ipconfig得出的ip地址,即可进行远程控制。后面的内容参考这位的笔记,非常完整,指路。自己导出了pdf版本。
牛客网C++服务器项目学习】-Day11-TCP基本原理
garbage_man的博客
12-17 1839
项目学习地址:【牛客网C++服务器项目学习】 day 12 TCP的通信: 1.TCP通信的过程 TCP协议作为传输层的协议,承担的任务是实现不同主机之间端-端的通信。在应用层上的协议,如http、ftp协议都是通过TCP协议完成可靠传输的。在我们使用例如,xftp这类软件进行文件传输时,看不见的背后是每一次进行传输,都会在通信的双方之间建立TCP连接,TCP通信的过程大致是这样的: 建立连接:三次握手的过程。 第一次握手:客户端发起连接。客户端会向服务端送请求连接的TCP报文。请求连接的T.
牛客网C++服务器项目学习】-Day09-网络模型个人总结
garbage_man的博客
12-13 4132
项目学习地址:【牛客网C++服务器项目学习】 day09 项目学习进入了第四章——网络编程。这一章的学习,前半段是对计算机网络体系进行一个大致的讲解。我自己在今年4月份系统性的看了《计算机网络自顶向下》以及中科大郑诠老师的视频。可是,碍于计网的学习主要以知识概念为主,很多知识学过一遍后就忘记了,在脑子中根本就记不住。现在项目既然复习到了这,我觉得有必要自己在文档中,用自己的语言,有条理的归纳一些计网的知识概念。这样做的好处有两个,一是可以帮助自己梳理知识、二是可以加深对某些知识的记忆。 知识点的总结按照.
牛客网C++服务器项目学习】Day15-线程池类的编写
garbage_man的博客
01-07 1446
项目学习地址:【牛客网C++服务器项目学习】 花了三小时,搞定了线程池类的编写,实际测试过了,能够正常跑通。性能测试还没去做,不知道和传统的【即时创建、即时销毁】机制比起来能够快多少。 写这个程序还是踩了一些坑,我把我写程序遇到的问题总结一下: 使用模板类编写省心。最开始我不愿意使用模板类进行线程池类的开发,想着说用不上。不过很快就遇到了问题: 向线程池中添加一个任务——函数,通常需要用结构体封装一下。因为函数做为参数,表达式太长了,有些许不方便。但是将函数封装在结构中,也带来了新的问题:不能将结构.
C++(Qt)软件调试-gdb调试入门用法(12)
08-16
标题提到的是"C++(Qt)软件调试-gdb调试入门用法(12)",这表明我们将探讨的是关于使用gdb调试C++程序,特别是与Qt相关的软件。描述中提到的是gdb调试入门用法的PDF版本,暗示我们将涵盖gdb的基础操作。标签包括"qt...
CN-GDBLinux上基于GDB-7.11的BANG-C源代码级调试器。-C/C++开发
05-27
有关gdb的更多信息,请参阅此文件夹中的README文件或检查GDB hom。CAMBRICON CN-GDB这是CN-GDBLinux上的BANG-C源代码级调试器,基于GNU-7.11,GNU源代码级调试器。 有关gdb的更多信息,请参阅此文件夹中的README...
Linux GDB C/C++调试基础与提升课程
06-13
分享一套课程——Linux GDB C/C++调试基础与提升视频课程,提供源码+PPT下载。
WebServer-master 牛客C++实战项目 高并发服务器(源码+注释)
11-12
在本项目中,"WebServer-master 牛客C++实战项目 高并发服务器(源码+注释)",我们关注的是使用C++语言构建一个能够处理高并发请求的Web服务器。这个实战项目旨在帮助开发者深入理解服务器端编程,特别是针对大规模...
C++学习源码_C++_c++源码网_Linux/Unix编程_
10-03
在IT领域,C++是一种广泛使用的面向对象的编程语言,尤其在系统软件、应用软件、游戏开发、设备驱动以及高性能计算等领域占据着重要地位。针对"Linux/Unix编程",C++学习源码能帮助开发者深入理解如何在这些操作...
文件描述符
adzn1的博客
06-05 3625
一、文件常见的几种打开与读写方式: FILE *fopen(const char *path, const char *mode);//它是库函数 打开文件 size_t fread(void *ptr, size_t size, size_t nmemb, FILE *stream);//读入数据 size_t fwrite(const void *ptr, size_t size, si...
牛客网项目——项目开发(十):热帖排行,生成长图,上传云服务器,性能优化
平什么阿的博客
06-03 1511
项目开发
牛客网项目总结
qq_41112238的博客
10-02 1417
牛客网项目总结 数据库 用户表,包括 id、用户名、密码、盐值、邮箱、类型(普通/管理员/版主)、状态(激活/未激活)、激活码(随机字符串)、头像 url、注册时间。 登录凭证表,包括 id、用户 id、登陆凭证(随机字符串)、登录状态(有效/无效)、过期时间。 评论表,包括 id、评论用户 id(索引)、评论实体 id(索引)、评论类型(帖子/回复)、被评论目标 id、评论内容、评论状态(有效/无效)、评论时间。 帖子表,包括 id、发帖用户 id(索引)、标题、帖子内容、类型(普通/置顶)、评论数量、状
GDB(二) 内存布局
ShuiLanJueDeTuZi的专栏
06-08 1417
在有效学习如何使用GDB前,你必须理解框架(frame)。因为它们是组成栈(stack)的框架,所以也被称为调用栈框(call stack frames)。要学习栈,我们需要知道一个执行的程序的内存布局。 每当一个进程被创建时,内核提供一块可以放置在任何地方的内存。然而,通过虚拟内存 (virtual memory,VM)的魔力,进程相信它拥有计算机上的所有内存。你可以已经听说过当RAM用完时使
计算机系统篇之虚拟内存(4):再探 mmap
woquhan的博客
12-07 445
本文通过示例的方式研究了参数 length 和 offset 对 mmap 函数行为的影响,从而更好地理解内存映射。
7.GDB文件IO
许挂挂的博客
02-10 810
1.GDB 什么是 GDB 调试 1.1 GDB 准备工作 gdb 是一个 shell 指令,必须带有 -g 的参数,程序才将调试信息添加到文件中 g++ -g a.cpp -o a.out // 先为文件添加调试信息 打开所有的 warning 选项 g++ -g -Wall main.cpp -o main 如果文件文件之间有引用如何编译: g++ -g 1.cpp 2.cpp -o main 开始调试 gdb a.out // gdb + 可执行程序 -g 的作用是在可执行文件中加入源码
Linux文件文件描述符详解:I/O操作与系统调用
"Linux文件文件描述符是操作系统与应用程序交互的重要机制,尤其在嵌入式Linux应用程序开发中扮演着核心角色。文件描述符Linux中是一个非负整数,用于标识进程打开的文件,是内核管理和操作文件的关键。在...
写文章

热门文章

  • 基于Linux的C++轻量级web服务器/webserver/httpserver 9847
  • 哈工大-操作系统-HitOSlab-李治军-实验0-在自己电脑上搭建实验环境 6253
  • 哈工大-操作系统-HitOSlab-李治军-实验2-系统调用 5678
  • 哈工大-操作系统-HitOSlab-李治军-实验3-进程运行的轨迹跟踪与统计 4869
  • 基于Linux的C++轻量级web服务器/webserver/httpserver——线程池 4443

分类专栏

  • C++自学笔记 10篇
  • 服务器项目学习 30篇
  • 数据结构和算法自学笔记 7篇
  • 操作系统OS 8篇
  • 计算机网络 2篇
  • 随手写写 1篇

最新评论

  • 哈工大-操作系统-HitOSlab-李治军-实验3-进程运行的轨迹跟踪与统计

    越12: process.log有问题,不建议按这个做,全是错

  • 哈工大-操作系统-HitOSlab-李治军-实验4-基于内核栈切换的进程切换

    faft: 要怎么改阿,我一改就linux0.11j进不去了

  • 哈工大-操作系统-HitOSlab-李治军-实验2-系统调用

    找不到591: 删完注释之后再次编译,也是成功的,退出来./run竟然打不开bochs的输入界面,输

  • 【牛客网C++服务器项目学习】Day12-网络编程的两种事件处理模式

    coldcodacode: 你好,请问能租你的牛客帐号看这个课程视频吗,这个视频是付费的

  • 你真的理解c++中初始化和赋值这两个概念吗?

    开始努力的阿凡: 谢谢哥 明白了点

大家在看

  • 安全测试之WPA2-PSK的密码测试 557
  • JSP基于SSM的线上读书系统68t48程序+源码+数据库+调试部署+开发环境
  • 上传excel文件后修改表格内容报错The requested file could not be read, typically due to permission problems that ha
  • 告别本地硬件烦恼,一分钟教你用云端部署玩Stable Diffusion!
  • LyP-1;肿瘤淋巴管归巢肽;CGNKRTRGC;CAS号:454487-07-1

最新文章

  • main.c从编译到运行到底发生了什么
  • Web服务器——踩过的坑(一)
  • Redis的消息队列学习笔记
2023年1篇
2022年20篇
2021年36篇
2020年2篇

目录

目录

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值

PHP网站源码东莞网站优化按天计费吉祥网站推广系统龙华百度关键词包年推广坪地营销网站观澜seo网站优化荷坳网站优化按天计费南山企业网站设计罗湖百度竞价罗湖推广网站坂田外贸网站制作大芬seo南澳企业网站设计惠州seo优化宝安网站建设设计吉祥如何制作网站沙井网站推广系统木棉湾百度爱采购坪地设计公司网站光明百度关键词包年推广爱联外贸网站制作双龙模板网站建设横岗百度网站优化排名福田seo双龙网站定制横岗seo网站优化广州设计公司网站双龙网站优化软件大芬seo同乐高端网站设计深圳企业网站设计歼20紧急升空逼退外机英媒称团队夜以继日筹划王妃复出草木蔓发 春山在望成都发生巨响 当地回应60岁老人炒菠菜未焯水致肾病恶化男子涉嫌走私被判11年却一天牢没坐劳斯莱斯右转逼停直行车网传落水者说“没让你救”系谣言广东通报13岁男孩性侵女童不予立案贵州小伙回应在美国卖三蹦子火了淀粉肠小王子日销售额涨超10倍有个姐真把千机伞做出来了近3万元金手镯仅含足金十克呼北高速交通事故已致14人死亡杨洋拄拐现身医院国产伟哥去年销售近13亿男子给前妻转账 现任妻子起诉要回新基金只募集到26元还是员工自购男孩疑遭霸凌 家长讨说法被踢出群充个话费竟沦为间接洗钱工具新的一天从800个哈欠开始单亲妈妈陷入热恋 14岁儿子报警#春分立蛋大挑战#中国投资客涌入日本东京买房两大学生合买彩票中奖一人不认账新加坡主帅:唯一目标击败中国队月嫂回应掌掴婴儿是在赶虫子19岁小伙救下5人后溺亡 多方发声清明节放假3天调休1天张家界的山上“长”满了韩国人?开封王婆为何火了主播靠辱骂母亲走红被批捕封号代拍被何赛飞拿着魔杖追着打阿根廷将发行1万与2万面值的纸币库克现身上海为江西彩礼“减负”的“试婚人”因自嘲式简历走红的教授更新简介殡仪馆花卉高于市场价3倍还重复用网友称在豆瓣酱里吃出老鼠头315晚会后胖东来又人满为患了网友建议重庆地铁不准乘客携带菜筐特朗普谈“凯特王妃P图照”罗斯否认插足凯特王妃婚姻青海通报栏杆断裂小学生跌落住进ICU恒大被罚41.75亿到底怎么缴湖南一县政协主席疑涉刑案被控制茶百道就改标签日期致歉王树国3次鞠躬告别西交大师生张立群任西安交通大学校长杨倩无缘巴黎奥运

PHP网站源码 XML地图 TXT地图 虚拟主机 SEO 网站制作 网站优化