自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(40)
  • 收藏
  • 关注

原创 C语言-文件操作

1磁盘文件和设备文件1磁盘文件和设备文件磁盘文件指一组相关数据的有序集合,通常存储在外部介质(如磁盘)上,使用时才调入内存。设备文件在操作系统中把每一个与主机相连的输入、输出设备看作是一个文件,把它们的输入、输出等同于对磁盘文件的读和写。1.2文本文件和二进制文件1)文本文件基于字符编码,常见编码有ASCII、UNICODE等一般可以使用文本编辑器直接打开数5678的以ASCII存储形式(ASCII码)为:2)二进制文件基于值编码,自己根据具体应用,指定某个值是什么意思。

2023-11-15 01:01:24 111

原创 DBeaver无法远程连接linux上的mysql客户端,Ubuntu或者centos

mysql客户端连接不上问题

2023-11-11 12:28:33 329

原创 06-libevent 第三方的网络框架

链接监听器封装了底层的socket通信相关函数, 比如socket, bind, listen, accept这几个函数。答案: 当服务器收到新的连接请求的时候, 会自动触发listener_cb回调函数, 该函数中有往bufferevent缓冲区中写入的操作(调用bufferevent_write), 接着又会触发写回调函数conn_writecb的执行, 这个回调函数中调用了bufferevent_free, 该函数能够释放bufferevent, 同时会关闭socket连接.

2023-11-06 16:42:56 78

原创 05-线程池 UDP - 本地套接字

简单的说,如果一个应用需要频繁的创建和销毁线程,而任务执行的时间又非常短,这样线程创建和销毁的带来的开销就不容忽视,这时也是线程池该出场的机会了。需要注意的是: bind函数会自动创建socket文件, 若在调用bind函数之前socket文件已经存在, 则调用bind会报错, 可以使用unlink函数在bind之前先删除文件.任务池相当于共享资源, 所以需要使用互斥锁, 当任务池中没有任务的时候需要让线程阻塞, 所以需要使用条件变量.TCP:传输控制协议, 面向连接的,稳定的,可靠的,安全的数据流传递。

2023-11-06 01:17:37 87

原创 04-高并发服务器poll-epoll-epoll反应堆

read函数在非阻塞模式下读的时候, 若返回-1, 且errno为EAGAIN, 则表示当前资源不可用, 也就是说缓冲区无数据(缓冲区的数据已经读完了);epoll_wait的events是一个传出参数, 调用epoll_ctl传递给内核什么值, 当epoll_wait返回的时候, 内核就传回什么值,不会对struct event的结构体变量的值做任何修改.缓冲区中有数据只会通知一次, 之后再有数据才会通知.(若是读数据的时候没有读完, 则剩余的数据不会再通知, 直到有新的数据到来)

2023-11-05 23:45:31 26

原创 03-TCP-状态转换图 高并发服务器-select-poll-epoll

由于TCP有可能存在丢包重传, 丢包重传若发给了已经断 开连接之后相同的socket-pair(该连接是新建的, 与原来的socket-pair完 全相同, 双方使用的是相同的IP和端口), 这样会对之后的连接造成困扰, 严重可能引起程序异常.若是先关闭的客户端, 再关闭的服务端, 此时启动服务端就不会报这个错误.如果一方close, 另一方没有close, 则认为是半关闭状态, 处于半关闭状态的 时候, 可以接收数据, 但是不能发送数据. 相当于把文件描述符的写缓冲区 操作关闭了.

2023-11-05 01:56:57 63

原创 02-三次握手和四次挥手 高并发服务器(多进程和多线程)

TCP是面向连接的安全的数据传输, 在客户端与服务端建立建立的时候要经过三次握手的过程, 在客户端与服务端断开连接的时候要经历四次挥手的过程, 下图是客户端与服务端三次握手建立连接, 数据传输和断开连接四次挥手的全过程.在客户端给服务端发包的时候, 不一定是非要等到服务端返回响应包, 由于客户端知道服务端的窗口大小, 所以可以持续多次发送, 当发送数据达到对方窗口大小了就不再发送, 需要等到对方进行处理, 对方处理之后可继续发送.第二种方案: 使用多线程, 让主线程接受新连接, 让子线程处理与客户端通信;

2023-11-04 23:20:28 28

原创 01-基础概念 socket编程

传统的进程间通信借助内核提供的IPC机制进行, 但是只能限于本机通信, 若要跨机通信, 就必须使用网络通信.( 本质上借助内核-内核提供了socket伪文件的机制实现通信----实际上是使用文件描述符), 这就需要用到内核提供给用户的socket API函数库.序号: TCP是安全可靠的, 每个数据包都带有序号, 当数据包丢失的时候, 需要重传, 要使用序号进行重传. 控制数据有序, 丢包重传.如下图, 一个文件描述符操作两个缓冲区, 这点跟管道是不同的, 管道是两个文件描述符操作一个内核缓冲区.

2023-11-04 17:04:42 20

原创 09-线程同步

线程同步,指一个线程发出某一功能调用时,在没有得到结果之前,该调用不返回。同时其它线程为保证数据一致性,不能调用该功能。创建两个线程,让两个线程共享一个全局变量int number, 然后让每个线程数5000次数,看最后打印出这个number值是多少?线程A代码片段:线程B代码片段:代码片段说明代码中使用调用usleep是为了让两个子线程能够轮流使用CPU,避免一个子线程在一个时间片内完成5000次数数。

2023-11-04 01:58:01 20

原创 08-守护进程和线程

linux下线程的属性是可以根据实际项目需要,进行设置,之前讨论的线程都是采用线程的默认属性,默认属性已经可以解决绝大多数开发时遇到的问题,如果对程序的性能提出更高的要求,则需要设置线程属性,本节以设置线程的分离属性为例讲解设置线程属性。是由于主线程可能会在一个cpu时间片内连续创建了5个子线程,此时变量i的值变成了5,当主线程失去cpu的时间片后,子线程得到cpu的时间片,子线程访问的是变量i的内存空间的值,所以打印出来值为5.不受用户登录、注销的影响,一直在运行着,他们都是守护进程。

2023-11-03 22:59:22 21

原创 07-信号

信号是信息的载体,Linux/UNIX 环境下,古老、经典的通信方式, 现下依然是主要的通信手段。进程A给进程B发送信号,进程B收到信号之前执行自己的代码,收到信号后,不管执行到程序的什么位置,都要暂停运行,去处理信号,处理完毕后再继续执行。与硬件中断类似——异步模式。但信号是软件层面上实现的中断,早期常被称为“软中断”。每个进程收到的所有信号,都是由内核负责发送的。信号有三种状态:产生、未决和递达。信号的实现手段导致信号有很强的延时性,但对于用户来说,时间非常短,不易察觉。

2023-11-02 23:45:15 22

原创 06-进程间通信

任何一个进程的全局变量在另一个进程中都看不到,所以进程和进程之间不能相互访问,要交换数据必须通过内核,在内核中开辟一块缓冲区,进程1把数据从用户空间拷到内核缓冲区,进程2再从内核缓冲区把数据读走,内核提供的这种机制称为进程间通信(IPC,InterProcess Communication)。一个进程在由pipe()创建管道后,一般再fork一个子进程,然后通过管道实现父子进程间的通信(因此也不难推出,只要两个进程中存在血缘关系,这里的血缘关系指的是具有共同的祖先,都可以采用管道方式来进行通信)。

2023-11-02 17:03:22 20

原创 05-进程控制

有的时候需要在一个进程里面执行其他的命令或者是用户自定义的应用程序,此时就用到了exec函数族当中的函数。使用方法一般都是在父进程里面调用fork创建处子进程,然后在子进程里面调用exec函数。execl函数函数原型:参数介绍:path:要执行的程序的绝对路径变参arg:要执行的程序的需要的参数arg:占位,通常写应用程序的名字arg后面的命令的参数参数写完之后NULL返回值:若是成功,则不返回,不会再执行exec函数后面的代码;若是失败,会执行execl。

2023-11-02 12:02:36 18

原创 04-文件和目录操作

如果 whence 是 SEEK_END,文件偏移量将被设置为文件长度加上 offset,offset 可以为正也可以为负。新打开文件返回文件描述符表中未使用的最小文件描述符, 调用open函数可以打开或创建一个文件, 得到一个文件描述符.//连到该文件的硬连接数目,刚建立的文件值为1。S_IRWXU 00700 掩码, 过滤 st_mode中除文件所有者权限以外的信息。//文件的类型和存取的权限。以O_NONBLOCK方式打开可以做非阻塞I/O(NonblockI/O),非阻塞I/O。

2023-11-02 00:03:01 29

原创 03-makefile-gdb-文件IO

makefile文件中定义了一系列的规则来指定, 哪些文件需要先编译, 哪些文件需要后编译, 哪些文件需要重新编译, 甚至于进行更复杂的功能操作, 因为makefile就像一个Shell脚本一样, 其中也可以执行操作系统的命令. makefile带来的好处就是——“自动化编译”, 一旦写好, 只需要一个make命令, 整个工程完全自动编译, 极大的提高了软件开发的效率.GDB 可以打印出所调试程序的源代码, 当然, 在程序编译时一定要加上-g的参数, 把源程序信息编译到执行文件中。不然就看不到源程序了。

2023-11-01 15:47:45 28

原创 02-vim和gcc库的制作和使用

动态库在程序运行时才被载入, 也解决了静态库对程序的更新、部署和发布会带来麻烦. 用户只需要更新动态库即可, 增量更新. 为什么需要动态库, 其实也是静态库的特点导致.由于由静态库生成的可执行文件是把静态库加载到了其内部, 所以静态库生成的可执行文件一般会比动态库大.不同的应用程序如果调用相同的库, 那么在内存里只需要有一份该共享库的拷贝, 规避了空间浪费问题.库是二进制文件, 是源代码文件的另一种表现形式, 是加了密的源代码;2 部署更新麻烦, 因为静态库修改以后所有的调用到这个静态库的可执行文。

2023-11-01 10:45:51 74

原创 01-Linux常用基础命令

如开始在: /home/itcast/test/course/day1/test目录下, 执行了cd命令切换到家目录下, 然后在执行cd -又回到了/home/itcast/test/course/day1/test下.Linux系统的目录结构是一个倒立的树状结构, 根目录用/表示,对比windows目录结构理解linux的目录结构。在宿主目录下创建多级目录: mkdir -p ~/test/hello/world/aa。cp 拷贝目录也可以用-a参数, 这样可以保留被拷贝的文件的一些属性信息。

2023-11-01 00:03:37 24

原创 STL基础03-常用算法

算法主要是由头文件<algorithm> <functional> <numeric>组成。<algorithm>是所有STL头文件中最大的一个,其中常用的功能涉及到比较,交换,查找,遍历,复制,修改,反转,排序,合并等...<numeric>体积很小,只包括在几个序列容器上进行的简单运算的模板函数.<functional> 定义了一些模板类,用以声明函数对象。

2023-10-25 23:16:41 21

原创 STL基础02-常用容器

C风格字符串(以空字符结尾的字符数组)太过复杂难于掌握,不适合大程序的开发,所以C++标准库定义了一种string类,定义在头文件<string>。string封装了char*,管理这个字符串,是一个char*型的容器。查找find,拷贝copy,删除delete 替换replace,插入insertstring管理char*所分配的内存。每一次string的复制,取值都由string类负责维护,不用担心复制越界和取值越界等。

2023-10-25 22:51:36 25

原创 STL基础01-概述

长久以来,软件界一直希望建立一种可重复利用的东西,以及一种得以制造出”可重复运用的东西”的方法,让程序员的心血不止于随时间的迁移,人事异动而烟消云散,从函数(functions),类别(classes),函数库(function libraries),类别库(class libraries)、各种组件,从模块化设计,到面向对象(object oriented ),为的就是复用性的提升。STL收录的算法经过了数学上的效能分析与证明,是极具复用价值的,包括常用的排序,查找等等。负责空间的配置与管理。

2023-10-25 20:20:48 22

原创 C++核心编程06-输入和输出流

如果删去程序中的第7行和第10行,虽然在第8行和第11行中用成员函数setf设置了hex和oct格式,由于未终止dec格式,因 此hex和oct的设置均不起作用,系统依然以十进制形式输出。如果在C语言中用prinf函数输出不同类型的数据,必须分别指定相应 的输出格式符,十分麻烦,而且容易出错。格式标志见表13.5。在输出数据时,为简便起见,往往不指定输出的格式,由系统根据数据的类型采取默认的格式,但有时希望数据按指定的格式输出,如要求以十六进制或八进制形式输出一个整数,对输出的小数只保留两位小数等。

2023-10-25 17:01:08 49 1

原创 C++核心编程05-异常

标准库中也提供了很多的异常类,它们是通过类继承组织起来的。异常类继承层级结构图如下:每个类所在的头文件在图下方标识出来。

2023-10-25 16:33:30 25 1

原创 C++核心编程04-类型转换

新类型的强制转换可以提供更好的控制强制转换过程,允许控制各种不同种类的强制转换。C++风格的强制转换其他的好处是,它们能更清晰的表明它们要干什么。例如,如果将一个整型值赋给一个浮点类型的变量,编译器会暗地里将其转换成浮点类型。转换是非常有用的,但是它也会带来一些问题,比如在转换指针时,我们很可能将其转换成一个比它更大的类型,但这可能会破坏其他的数据。使用C风格的强制转换可以把想要的任何东西转换成我们需要的类型。标准c++提供了一个显示的转换的语法,来替代旧的C风格的类型转换。

2023-10-25 16:07:01 25 1

原创 C++核心编程03-模板

c++提供了函数模板(function template.)所谓函数模板,凡是函数体相同的函数都可以用这个模板代替,不必定义多个函数,只需在模板中定义一次即可。在调用函数时系统会根据实参的类型来取代模板中的虚拟类型,从而实现不同函数的功能。1.2.1 什么是函数模板?hello.cpp程序是高级c语言程序,这种程序易于被人读懂。为了在系统上运行hello.c程序,每一条c语句都必须转化为低级的机器指令。然后将这些机器指令打包成可执行目标文件格式,并以二进制形式存储于磁盘中。

2023-10-25 15:48:34 29 1

原创 C++核心编程02-类和对象

当一个对象被创建后,它的每一个成员函数都含有一个系统自动生成的隐含指针this,用以保存这个对象的地址,也就是说虽然我们没有写上this指针,编译器在编译的时候也是会加上的。定义一个结构体用来表示一个对象所包含的属性,函数用来表示一个对象所具有的行为,这样我们就表示出来一个事物,在c语言中,行为和属性是分开的,也就是说吃饭这个属性不属于某类对象,而属于所有的共同的数据,所以不单单是PeopleEat可以调用Person数据,AnimalEat也可以调用Person数据,那么万一调用错误,将会导致问题发生。

2023-10-25 01:39:18 93 1

原创 C++核心编程01-初始、C++对C的扩展

那时,尽管C委员会决定在C中引入const,但是,他们c中的const理解为”一个不能改变的普通变量”,也就是认为const应该是一个只读变量,既然是变量那么就会给const分配内存,并且在c中const是一个全局只读变量,c语言中const修饰的只读变量是外部连接的。由于C使用不同的扩展名来表示不同文件类型,因此用一些特殊的扩展名(如hpp或hxx)表示c++的头文件也是可以的,ANSI/IOS标准委员会也认为是可以的,但是关键问题是用哪个比较好,最后一致同意不适用任何扩展名。此标识符作为此组群的名字。

2023-10-24 21:08:47 30 1

原创 C语言高级06-函数指针和回调函数

通过函数类型定义的变量是不能够直接执行,因为没有函数体。只能通过类型定义一个函数指针指向某一个具体函数,才能调用。函数指针变量常见的用途之一是把指针作为参数传递到其他函数,指向函数的指针也可以作为参数,以实现函数地址的传递。这一点和数组一样,因此我们可以用一个指针变量来存放这个入口地址,然后通过该指针变量调用函数。C语言中的函数有自己特定的类型。一个函数在编译时被分配一个入口地址,这个地址就称为函数的指针,函数参数除了是普通变量,还可以是函数指针变量。指针函数是返回类型为指针的函数;// f 为函数类型。

2023-10-24 00:53:58 27 1

原创 C语言高级05-结构体

int age;}p1;//定义类型同时定义变量struct{int age;}p2;//定义类型同时定义变量//通过类型直接定义。

2023-10-23 23:46:19 19

原创 C语言04-多维数组

在绝大多数表达式中,数组名的值是指向数组第1个元素的指针。这个规则只有两个例外,sizeof和对数组名&。指针和数组并不相等。当我们声明一个数组的时候,同时也分配了内存。但是声明指针的时候,只分配容纳指针本身的空间。当数组名作为函数参数时,实际传递给函数的是一个指向数组第1个元素的指针。我们不单可以创建指向普通变量的指针,也可创建指向数组的指针。

2023-10-23 19:12:28 30

原创 C语言高级03-位运算

其思想是如果b是一个位(1或0),那么如果b为1则b^1为0,如果b为0,则1^b为1。4个位运算符用于整型数据,包括char.将这些位运算符成为位运算的原因是它们对每位进行操作,而不影响左右两侧的位。请注意该运算符不会改变a的值,a仍为2。左移运算符<<将其左侧操作数的值的每位向左移动,移动的位数由其右侧操作数指定。右移运算符>>将其左侧的操作数的值每位向右移动,移动的位数由其右侧的操作数指定。对于每个位,如果操作数中的对应位有一个是1(但不是都是1),那么结果是1.如果都是0或者都是1,则结果位0.

2023-10-23 17:25:37 24

原创 C语言高级02-指针强化

此时指针指向的就是“垃圾”内存。变量b是一个“指向整型的指针”,所以任何指向b的类型必须是指向“指向整型的指针”的指针,更通俗地说,是一个指针的指针。但从定义上看,NULL指针并未指向任何东西,因为对一个NULL指针因引用是一个非法的操作,在解引用之前,必须确保它不是一个NULL指针。注意:对一个int*类型指针解引用会产生一个整型值,类似地,对一个float*指针解引用会产生了一个float类型的值。通过一个指针访问它所指向的地址的过程叫做间接访问,或者叫解引用指针,这个用于执行间接访问的操作符是*。

2023-10-23 17:10:38 38

原创 C语言高级01-内存分区(数据类型、变量、程序内存分区模型)

realloc不会自动清理增加的内存,需要手动清理,如果指定的地址后面有连续的空间,那么就会在已有地址基础上增加内存,如果指定的地址后面没有空间,那么realloc会重新分配新的连续内存,把旧内存的值拷贝到新内存,同时释放旧内存。在理解C/C++内存分区时,常会碰到如下术语:数据区,堆,栈,静态区,常量区,全局区,字符串常量区,文字常量区,代码区等等,初学者被搞得云里雾里。在函数将参数压入栈中之后,函数体会被调用,此后需要将被压入栈中的参数全部弹出,以使得栈在函数调用前后保持一致。

2023-10-23 16:07:24 73

原创 C语言基础9-文件操作

10.文件操作10.

2023-10-23 01:26:47 34

原创 C语言基础08-复合类型(自定义类型)

9. 复合类型(自定义类型)9. 复合类型(自定义类型)9.1 结构体91.1 概述数组:描述一组具有相同类型数据的有序集合,用于处理大量相同类型的数据运算。有时我们需要将不同类型的数据组合成一个有机的整体,如:一个学生有学号/姓名/性别/年龄/地址等属性。显然单独定义以上变量比较繁琐,数据不便于管理。C语言中给出了另一种构造数据类型——结构体。9.1.2结构体变量的定义和初始化定义结构体变量的方式:先声明结构体类型再定义变量名在声明类型的同时定义变量。

2023-10-23 00:48:07 35

原创 C语言基础07-内存管理

8.内存管理8.1 作用域C语言变量的作用域分为:代码块作用域(代码块是{}之间的一段代码)函数作用域文件作用域8.1.1。

2023-10-22 22:47:38 32 1

原创 C语言基础06-指针

7. 指针7. 指针7.1 概述71.1 内存712物理存储器和存储地址空间有关内存的两个概念:物理存储器和存储地址空间。物理存储器:实际存在的具体存储器芯片。存储地址空间:对存储器编码的范围。我们在软件上常说的内存是指这一层含义。寻址:可以根据分配的号码找到相应的存储单元,完成数据的读写713内存地址714指针和指针变量内存区的每一个字节都有一个编号,这就是“地址”。指针是内存单元的编号,指针变量是存放地址的变量。

2023-10-22 22:05:58 25 1

原创 C语言基础05-函数

1)定义是指对函数功能的确立,包括指定函数名、函数类型、形参及其类型、函数体等,它是一个完整的、独立的函数单位。2)声明的作用则是把函数的名字、函数类型以及形参的个数、类型和顺序(注意,不包括函数体)通知编译系统,以便在对包含函数调用的语句进行编译时,据此对其进行对照检查(例如函数名是否正确,实参与形参的类型和个数是否一致)。6.5 main函数与exit函数。

2023-10-22 18:24:20 22

原创 C语言基础04-数组和字符串

5.数组和字符串5.数组和字符串5.1概述在程序设计中为了方便处理数据把具有相同类型的若干变量按有序形式组织起来——称为数组。数组就是在内存中连续的相同类型的变量空间。同一个数组所有的成员都是相同的数据类型,同时所有的成员在内存中的地址是连续的。数组属于构造数据类型:一个数组可以分解为多个数组元素:这些数组元素可以是基本数据类型或构造类型。inta[10];

2023-10-22 17:54:46 24

原创 C语言基础03-运算符和分支循环语句

3. 运算符与表达式3. 运算符与表达式3.1 常用运算符分类运算符类型作用算术运算符用于处理四则运算赋值运算符用于将表达式的值赋给变量比较运算符用于表达式的比较,并返回一个真值或假值逻辑运算符用于根据表达式的值返回真值或假值位运算符用于处理数据的位运算sizeof运算符用于求字节数长度3.2算术运算符运算符术语示例结果正号+33负号-3-3加10 + 515减10 - 55乘10 * 550除10 / 52取模(取余)

2023-10-22 17:05:40 21

原创 C语言基础01、02-helloworld、变量、常量、数据类型

原码表示法简单易懂,与带符号数本身转换方便,只要符号还原即可,但当两个正数相减或不同符号数相加时,必须比较两个数哪个绝对值大,才能决定谁减谁,才能确定结果是正还是负,所以原码不便于加减运算。register是建议型的指令,而不是命令型的指令,如果CPU有空闲寄存器,那么register就生效,如果没有空闲寄存器,那么register无效。八进制,Octal,缩写OCT或O,一种以8为基数的计数法,采用0,1,2,3,4,5,6,7八个数字,逢八进1。对数值型的来说,未指定n时,隐含的精度为n=6位。

2023-10-22 16:28:26 34

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除