自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 [Linux网络编程]10-http协议,分别使用epoll和libevent两种方式实现B/S服务器

一.HTTP协议,Request请求和Response响应 二.常用状态码

2024-11-11 00:12:45 521

原创 [Linux网络编程]09-libevent库,event与bufferevent,buffevent实现TCP通信

event_new --> event —> 非未决 --> event_add --> 未决 --> dispatch() && 监听事件被触发 --> 激活态。–> 执行回调函数 --> 处理态 --> 非未决 event_add && EV_PERSIST --> 未决 --> event_del --> 非未决。address、len:等同于 connect()的参2和参3-------服务器的地址结构。读:有数据–>读回函数被调用–>使用bufferevent_read()–>读数据。

2024-11-07 00:24:17 912

原创 [Linux网络编程]08-线程池原理,线程池源码阅读了解

我们使用线程的时候就去创建一个线程,这样实现起来非常简便,但是就会有一个问题:如果并发的线程数量很多,并且每个线程都是执行一个时间很短的任务就结束了,

2024-10-31 22:39:46 645

原创 [Linux网络编程]07-epoll函数原理解析和使用,ET模式和LT模式,epoll反应堆模型了解

反应堆的理解:加入IO转接之后,有了事件,server才去处理,这里反应堆也是这样,由于网络环境复杂,服务器处理数据之后,如遇到网络繁忙或者对方缓冲区已经满了这种情况,就不能直接写回给客户端。所以需要对socket的读写都进行监听。

2024-10-27 21:31:15 656

原创 [Linux网络编程]06-I/O多路复用策略---select,poll分析解释,优缺点,实现IO多路复用服务器

I/O多路复用是一种用于提高系统性能的 I/O 处理机制。它允许一个进程(或线程)同时监视多个文件描述符(可以是套接字、管道、终端设备等),等待这些文件描述符中出现读、写或异常状态。一旦有满足条件的文件描述符状态发生变化,进程(或线程)就能立即得到通知并进行相应的 I/O 操作处理。在socket编程阶段,未接触IO多路复用前,服务器需要阻塞在accept函数上,直到等待客户端通过connect发起连接请求,才执行接下来的逻辑。而使用IO多路复用,可以先监听是否有客户端的连接操作,再执行accept,

2024-10-23 22:25:04 1065

原创 [Linux网络编程]05-TCP状态和端口复用,shutdown函数(主动方建立/关闭连接状态,被动方建立/关闭连接状态,2MSL时长,TCP其他状态)

(等待期间,对端没收到我发的ACK,对端会再次发送FIN请求。

2024-10-21 23:38:17 621

原创 [Linux网络编程]04-多进程/多线程并发服务器思路分析及实现(进程,信号,socket,线程...)

从而直接执行接下来的fork函数,这就会导致一个子进程刚好被回收后,又会产生一个新的子进程,为了防止这种情况,使用again和goto维护accept,防止被信号打断后产生错误。1.利用while 和 accept 阻塞等待客户端连接,一旦有一个客户端连接上,就创建一个新的子进程执行服务逻辑。实现一个服务器可以连接多个客户端,每当accept函数等待到客户端进行连接时 就创建一个子进程;3.注意,当主进程阻塞在accept时,若子进程发出信号,accept会被打断(

2024-10-21 22:54:10 666

原创 [Linux网络编程]03-TCP协议

主动发起连接请求端,发送 SYN 标志位,请求建立连接。携带序号号、数据字节数(0)、滑动窗口大小。被动接受连接请求端,发送 ACK 标志位,同时携带 SYN 请求标志位。携带序号、确认序号、数据字节数(0)、滑动窗口大小。主动发起连接请求端,发送 ACK 标志位,应答服务器连接请求。携带确认序号。主动关闭连接请求端, 发送 FIN 标志位。被动关闭连接请求端, 应答 ACK 标志位。----- 半关闭完成。被动关闭连接请求端, 发送 FIN 标志位。

2024-10-20 21:04:02 449

原创 [Linux网络编程]02-Socket编程

但是采用此函数进行大小端转换比较麻烦,因为linux中ip为字符串类型,而函数需要的是整数,所以linux提供了以下封装好的转换函数。------------------>宏,分别对应IPV4和IPV6。htons : 本地 --> 网络 (port端口)ntohs : 网络 --> 本地 (port)ntohl : 网络 --> 本地 (IP)htonl : 本地 -->网络 (IP)dst:传出,转换后的 网络字节序的 IP地址。src:传入,IP地址(点分十进制)

2024-10-19 16:06:43 1205

原创 [Linux网络编程]01-网络基础

主机间交互,需要先执行请求/回复操作,arp协议就是用来请求连接的,arp根据已知的ip地址获取对应mac地址,然后再利用以太网帧协议传输数据。每经过一个路由节点,该值-1, 减为0的路由,有义务将该数据包丢弃。192.168.1.108 — 点分十进制 IP地址(string) — 二进制。从应用的角度出发,协议可理解为“规则”,是数据传输和数据的解释的规则。缺点:不能缓存大量数据、严格遵守 http协议,不灵活。Ip地址:在网络环境中,唯一标识一台主机。目的端口号:16位。目的端口号:16位。

2024-10-19 15:09:14 432

原创 [Linux系统编程] 线程同步(互斥锁,读写锁,死锁,条件变量,信号量)

为简化理解,可忽略其实现细节,简单当成整数看待,只有两种取值:0,1 -------1代表未上锁,0代表已上锁。而利用条件变量,即使某线程率先抢到了锁,若条件不满足,也不能向下执行,需要先放锁给其他线程使用,提供了一种控制线程的手段。此函数作用比较复杂,一旦被调用,就会先阻塞,再释放已经持有的锁,直到该函数被其他线程唤醒后再次上锁。常用在pthread_mutex_lock上锁之后。生产者此时生产了数据后,会同时唤醒两个因条件变量阻塞的消费者,若结果A消费者拿到锁,开始消费数据,B消费者就阻塞在锁上。

2024-10-14 18:16:31 1021

原创 [Linux系统编程]线程概念,三级映射,线程操作函数

pthread_create()的第二个参数,指定线程的属性,传入NULL表示默认属性,也可以传入线程属性结构体pthread_attr_t 来控制线程属性。线程有线程id和线程号,线程id是用于进程内部标识线程的属性,而线程号是用于cpu标识执行单位的属性。pthread_detach()----------------- 无。线程分离,指线程执行完毕后无需其他线程使用join回收,而是会将自身回收。线程控制原语 -----------------进程控制原语。

2024-10-14 17:03:31 755

原创 [QT]记事本项目(信号槽,QT基础控件,QT文件操作,QT关键类,对话框,事件)

头文件。

2024-09-09 16:02:41 676

原创 [QT] QT事件与事件重写

如下,自定义按钮类。通过重写部分事件实现部分功能头文件源文件在ui文件中将widget提升为自定义的mybutton类后,即可使用自定义控件先前提到,信号槽机制,其实是一种事件处理的集成,因为先前对于MousePressEvent进行了重写,所以直接使用clicked信号会与按下事件产生冲突,所以此信号槽函数失效为了正常使用此功能,需要在对MousePressEvent事件的处理函数中手动添加emit click()

2024-09-07 15:47:24 715

原创 【QT】文件读写,文件对话框

为按钮设置信号槽,左一按钮为打开文件,左二按钮为保存文件。利用QFileDialog选择文件,再利用QFile类打开文件,最后使用QTextStream读取和写入文件。实现功能。//文件内容显示到编辑栏中//编辑后的内容保存到文件QString strsave = QFileDialog::getOpenFileName(this,"保存文件","C:\\Users\\SlanderMC\\Desktop");

2024-09-05 15:20:46 571

原创 QT信号和槽

Qt信号和槽机制提供了允许我们自己设计自己的信号和槽。emit函数用来发送信号自定义信号使用条件声明在类的signals域下没有返回值,void类型的函数只有函数声明,没有定义可以有参数,可以重载自定义槽函数使用条件qt4 slots域下面,qt5之后可以声明public下,同时还可以是静态的成员函数,全局函数,lambda表达式没有返回值,void类型的函数不仅有声明,还得要有实现可以有参数,可以重载。

2024-09-03 19:55:51 546

原创 QT基础控件和对象树机制

所有QT中的类几乎都是QObject的派生类,QObject是以对象树机制来组建起来的,在创建一个对象时,可以通过parent指针为其提供一个其父对象,我们创建的这个对象会自动添加到其父对象的 children()列表。当创建的对象在堆区时候,如果指定的父对象是QObject派生的类,可以不用管理释放的操作,将对象会放入到对象树中。父对象析构时,会检查是否还有它的子类存在,如果存在,则先去析构子类对象,然后再调用父对象析构,设置父亲:setParent(“”) —传入指针,将按钮加入到目标窗体中。

2024-08-11 18:23:24 281

原创 [Linux系统编程] 线程

线程的pcb中,与它属于的那个进程具有相同的三级映射结构(三级页表),这表示在将地址空间映射到内存时,线程和它属于的那个进程会映射到同一块内存区域。子进程的pcb与父进程不同,它有独立的三级页表,那么在进程地址空间经mmu映射时,会映射到一块不同于父进程的内存地址。5.内存地址空间(.text/.data/.bss/heap/共享库) --------3.对信号支持不好,优点相对突出,缺点均不是硬伤。2.处理器现场和栈指针(内核栈)2.调试、编写困难、gdb不支持。3.独立的栈空间(用户空间栈)

2024-07-07 00:28:13 326

原创 [Linux系统编程]进程组和会话,守护进程

Daemon(精灵)进程,是 Linux中的后台服务进程,通常独立于控制终端并且周期性地执行某种任务或等待处理某些发生的事件。3.通常根据需要,改变工作目录位置 chdir(“path”)—这是因为进程运行在后台,需要将进程工作目录迁移到一个不可被移除的目录下,防止出错。上文讲当一个进程创建会话后,会舍弃当前终端,到后台运行,可以作为守护进程,周期性的等待某种操作。6.建立新会话时,先调用 fork,父进程终止后,子进程调用setsid(),创建会话。1.创建会话的进程不能是进程组组长,创建后该进程变成。

2024-07-06 23:36:28 413

原创 [Linux系统编程]进程间通信---信号

Unix早期版本就提供了信号机制,但不可靠,信号可能丢失。Berkeley和AT&T都对信号模型做了更改,增加了可靠信号机制。硬件异常产生:如:非法访问内存(段错误)、除0(浮点数例外)、内存对齐出错(总线错误)A给B发送信号,B收到信号前在执行自己的代码,收到信号后,不管执行到程序的什么位置,进程控制块PCB,除了包含进程Pid,进程状态,进程工作目录,用户 id,组id,,Linux/UNIX 环境下,古老、经典的通信方式,现下依然是主要的通信手段。文件描述符表等,还应该包含了信号相关的信息,主要指。

2024-06-29 18:10:28 1029

原创 [Linux系统编程]进程间通信---管道/FIFO/存储映射IO(MMAP)

在进程间完成数据传递需要借助操作系统提供特殊的方法,如:文件、管道、信号、共享内存、消息队列、套接字、命名管道等。随着计算机的蓬勃发展,一些方法由于自身设计缺陷被淘汰或者弃用。现今常用的。

2024-06-17 17:41:40 1061 1

原创 [Linux系统编程]进程,父子进程,进程操作函数

各个进程有自己的虚拟内存空间,分为用户区和内核区,要运行进程,必须要将数据加载到内存中,这个映射的关系由CPU中的MMU来执行,对于用户区的数据,MMU将其映射到不同的内存区域,各自独立;而对于内核区的数据,例如PCB,MMU会将其映射至同一块内存空间。MMU会将内存分级,0级的内存空间对应内核区,会将内核区的数据映射在这里,而3级对于用户区。程序:不占用内存,未运行,只是二进制可执行文件,相当于。那么MMU是怎么划分内存,实现不同区域的映射的?进程:运行起来的程序,占用内存,相当于。

2024-06-06 20:55:26 896

原创 [Linux系统编程]目录操作函数,实现递归遍历目录

思路:传入一个目录,将其opendir打开获取DIR*,通过readdir依次获取内部文件,对于每一个文件,通过stat函数获取文件信息,检查其stat结构体中的st_mode属性,如果是文件,直接打印输出,如果是目录,则将该目录名作为参数,递归执行遍历函数。通过传入DIR*,对一个目录进行读取,每次返回一个dirent*,指向一个文件。需要注意的是,文件需要使用绝对路径,因为工作目录固定,在对其它目录操作时,相对路径找不到指定文件,所以在递归之前,需要拼接文件路径。如下,一个dirent结构体内部实现。

2024-06-06 20:27:41 651

原创 [Linux系统编程]文件重定向dup和dup2

操作系统在管理文件时,会管理一张文件描述符表,根据打开的文件,分配一个文件描述符(int),根据该文件描述符,锁定指向该文件的指针,从而索取文件。在linux中,可以使用**> 和 >>命令**来实现重定向,将控制台内容输入到文件中,它的具体实现就是dup函数。重定向的原理就是将一个文件描述符的指针重新定位,不再指向它原本的指针,而是重定位到另一个文件。通过重定向操作后,对进行重定向的这个文件描述符进行的操作,就成为了对它重定向的那个文件的操作。,以文件描述符为参数,返回被重定向的那个文件描述符。

2024-06-04 18:16:23 583

原创 [Linux系统编程]目录操作函数

一个dirent结构体中包含d_ino(inode编号),d_name(文件名)等内容。与文件关闭不同,关闭目录流用的是closedir(DIR* );reddir函数用于读取目录,每次读取一个目录项,返回一个。通过以opendir返回的DIR指针做参数,关闭目录流。目录也是一种文件,它存放其下的目录项。用于打开一个目录,返回一个。

2024-06-03 23:30:50 195

原创 [Linux系统编程]文件IO

但是库函数fputc开的缓冲区较大(默认4096字节),先在用户区中预读入,然后再一次性执行系统调用,就避免了大量的时间开销,所以,虽然每次都是读入一个字节,底层实现原理是。一个进程在内存中有自己的内存地址空间,其中,PCB(进程控制块)被存放在内存中,用来管理该进程,PCB本质上是一种数据结构,维护着进程的一些信息,其中就包含了文件描述符表。所以,若设置系统调用write/read的自定义缓冲区为1个字节,那么每读入一个字节,就要执行一次从用户区到内核区的跳转,时间开销大。

2024-05-31 19:09:13 662

原创 [Linux系统编程]gdb调试及makefile管理

一.gdb

2024-05-30 16:08:24 593

原创 [Linux系统编程] 静态库与动态库

在头文件中,要包含一个头文件守卫,防止重定义。

2024-05-29 18:38:58 558

原创 [Linux]服务管理

systemd是目前Linux系统上主要的系统守护进程管理工具,在开机后,首先执行systemd服务(其它进程的根源),然后根据当前系统的运行级别,选择对应的服务启动。是运行在后台的,通常都会监听某个端口,等待其它程序的请求 -------比如mysqld,防火墙等,因此我们又称为守护进程,是Linux中非常重要的知识点。systemctl status [服务名] --------是查看某个服务的当前状态。-------它管理/etc/init.d目录下的服务的自启动状态。

2024-05-25 11:02:31 1173 1

原创 [Linux]进程与进程管理

一般系统的服务都是以后台进程的方式存在,而且都会常驻在系统中。杀死进程也支持通配符,这在系统因负载过大而变得很慢 时很有用) -------使用killall杀死进程时,它的子进程也会被终止。kill -9 进程号 --------------"-9"选项可以强制杀死一个进程。若是某个进程执行一半需要停止时,或是已消了很大的系统资源时,此时可以考虑停止该进程。以ps -ef的方式查看进程,可以看到全格式的进程信息,包含父进程信息。查看进程还有一个更简便的方式-------pstree,进程树。

2024-05-24 17:50:13 440

原创 [Linux]网络原理与配置

虚拟系统的IP地址处于随机网段,同时在母机上会额外有一个与虚拟IP地址网段相同的IP地址,可以实现母机与虚拟机的通信。虚拟系统的IP地址可以通过主机实际的IP地址作为代理IP,与外部系统进行通信。自动分配会自动分配一个未被使用的端口,避免ip冲突,但是缺点也很明显,每次连接ip都不同,极不方便。启动linux系统时,IP地址随机分配,但其实可以通过网络配置操作指定系统的ip地址,见下。缺点:只能从虚拟系统到外部系统进行单向通信,而外部系统无法寻找虚拟系统进行通信。2.如何通过主机名,映射到ip地址。

2024-05-22 18:57:40 575

原创 [Linux]磁盘管理

需要注意的是,使用命令行工具实现的挂载,在系统重启后会失效,这是因为系统在每次启动时,都会去检查 /etc目录下的 fstab文件,该文件是一个表,存放着磁盘分区的挂载信息,要实现永久挂载,需要修改该文件。mount指令 mount /dev/[分区目录] [挂载目录] ------------表示将某分区挂载到某个目录。du -h [目录] ------查看某个目录的磁盘使用情况(不包括文件)访问目录,相当于访问某块分区。df -h -------查看系统整体磁盘使用容量。

2024-05-21 16:40:00 1025 1

原创 [Linux]Crond任务调度以及at任务调度

其中’/’ 后的每一个’*'都表示一个占位符,具体如下所示,默认情况下星号表示不指定。例子: */0 12 * * * ls -l >>/tmp/mydata。crontab -e 进入编辑页面,设定任务。* * * * * [具体任务]crontab -l 查看已有定时任务。crontab -r 删除所有任务。编辑时,需要指定间隔时间。

2024-05-20 09:38:37 314

原创 [Linux]组管理和权限管理

LInux系统中每一个用户都必须属于一个组,创建新用户时,可以指定组,如不指定,则默认创建一个与用户名相同的组。如下,用户zwj创建了x.txt文件,该文件属于zwj所在的组"wudang"发现文件x.txt的所在组跟随用户的组更改变,变为"mojiao"组。更改用户zwj的组从"wudang"到"mojiao"useradd -g 组名 用户名。usermod 组名 用户名。的所在组,默认一个文件属于。groupadd [组名]chgrp 组名 文件名。创建用户,并且指定组。

2024-05-17 18:02:18 257

原创 [Linux]常用基础命令(3)------日期指令,查找指令,压缩解压指令

locate相比find更快,find指令查找时从给定目录逐次向下检索,而locate指令做了优化,无需遍历整个目录结构,管道命令可以使用 符号"|" 搭配cat 使用,类似于more 和 less ,也可以单独使用。tar打包后的文件为tar.gz文件。还可以通过date指令修改系统时间。可以打印出某年全部月份的日历。,默认打印当前月份的日历。locate 文件名。

2024-05-16 10:50:00 297

原创 [Linux]常用基础命令(2)--------文件目录指令

more指令是一个基于VI编辑器的文本过滤器,它以全屏幕的方式按页显示文本文件的内容。对于比较大的文件,直接全部加载会占用很大内存,而使用less打开文件时,会根据显示要求,动态得将数据加载至内存,提高效率。如果第二个参数为其其他路径的文件,则作用为移动文件(类似cut剪切)与cat使用:cat -n /etc/profile | more。—能够实时追踪文件追加的内容(实践中常用)**>>:**追加内容到文件结尾。----可以指定显示前n行的内容。----指定查看后n行的内容。

2024-05-11 17:57:30 472 1

原创 [Linux]常用基础命令(1)------运行级别以及单用户模式找回密码

1.在linux启动界面输入e进入如下界面,找到以UTF-8结尾的字段。4.在新的一行输入passwd 并输入密码,然后再次确认。,输入回车后,系统运行完毕后自动重启,密码修改完成。下图,分别表示级别3和级别5。2.在UTF-8后输入“CentOS7中,使用。,即更改为运行级别3。

2024-05-11 14:16:16 382 1

原创 [Linux]用户管理

(必须加用户名,否则默认设置当前用户密码)各用户的信息都加密处理后表示。

2024-05-10 15:01:55 681

原创 [Linux]关机/重启指令与用户登录注销

使用xshell时,远程连接Linux,可以使用su - 用户名来切换用户(shell页面和终端都可以使用)logout为注销当前用户,无法在终端使用,只可以在xshell使用。sync:内存数据写入磁盘,立即执行。

2024-05-10 13:31:14 207

原创 [Linux学习笔记]vi/vim常用快捷指令

命令行模式下(一般模式下:进入),输入/关键字 可以查找内容,输入n可移动光标至下一个关键字。命令行模式下,输入/set nu设置行号,/set nonu 取消设置。一般模式下,使用 yy复制 使用p粘贴 几行可以写几yy。一般模式下 大写G 跳转至末尾 ,小写gg跳转至首行。一般模式下,先输入跳转至的行数,再shift+g跳转。一般模式下,使用u撤回上次操作。一般模式下,使用dd删除。

2024-04-30 11:41:09 143

空空如也

空空如也

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

TA关注的人

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