Linux
文章平均质量分 82
linux开发
Dutkig
奔跑吧, 用绝望追不上的速度。
展开
-
LInux——五种IO模型
Linux中的IO简述IO主要分为以下的三种:内存IO网络IO磁盘IO通常我们所说的IO是后两者,Linux中无法直接操作IO设备,必须通过系统调用请求kernal来协助完成IO的动作,内存会为每一个IO设备维护一个缓冲区。IO操作会涉及两个对象:调用这个IO的进程(或线程);系统内核的kernal五种模型介绍1、阻塞IO最简单的一种IO模型,简单理解就是死等,即进程或线程一直等待某个条件,不满足就会一直等待。2、非阻塞IO应用进程与内核交互,不断轮询,不停地去问内核数据是原创 2022-03-30 20:50:42 · 1233 阅读 · 0 评论 -
Linux——基础的操作命令
开始之前,先让我们大致了解一下什么是Linux?linux的特性(1)基于多用户的操作系统(2)基于命令行模式,windows是基于图形化界面的安装时:root用户(超级管理员)第一次启动时:一个user第一个普通用户,可通过创建命令创建其他用户linux和windows的区别(1)linux基于命令行模式,windows是基于图形化界面的(2)linux主要应用于服务器,windows是个人操作系统(3)linux属于开源项目,windows不开源(4)linux是多用户系统,win原创 2020-08-11 11:57:42 · 279 阅读 · 2 评论 -
Linux——文件系统:目录组织结构、文件类型、文件权限等
在Linux中,所有的设备都是文件。文件的类型是根据文件头字段来判断,而非文件的后缀名。Linux的文件系统:EXT4 索引式的文件系统以EXT4文件系统格式化磁盘时,将磁盘分成三个区:1.superblock 记录文件系统的整体信息,包括inode和block的总量,使用量,剩余量。2.inode.很多inode节点,给每一个inode都分配一个编码,一个文件会有一个inode节点,在此inode中存储文件的属性信息原创 2020-08-12 17:55:08 · 258 阅读 · 0 评论 -
Linux——vi,vim的使用 + 文件的压缩解压
windows上的文本编译器:NotePad++、记事本——>源代码——>通过vs(IDE集成开发环境)——>.exelinux系统的开发:vi,vim——>源代码——>通过gcc,g++——>a.outvi与vim的区别1、多级撤消 在vi编辑器中,按u只能撤消上次命令,而在vim里可以无限制的撤消。2、易用性 vi编辑器只能运行于unix中,而vim不仅可以运行于unix,还可用于windows、mac等多操作平台。3、语法加亮vim原创 2020-08-16 17:28:21 · 1634 阅读 · 1 评论 -
Linux——gcc和g++的区别和应用
预编译gcc -E 源文件 -o 要生成的文件名(`**.i`)编译gcc -S **.i ——>默认生成一个**.s文件汇编gcc -c **.s——>默认生成一个**.o文件(可重定位的二进制目标文件)预编译,编译,汇编叫做编译过程,都是单文件单独编译,每一个.c文件编译完成后都会有一个与其对应的.o文件链接gcc **.o **——>默认生成一个**a.out文件(可执行文件)gcc **.o -o指定可执行文件名 常.原创 2020-08-02 12:37:47 · 392 阅读 · 0 评论 -
Linux——gdb调试
前言介绍:GDB是GNU开源组织发布的一个强大的UNIX下的程序调试工具,GDB主要可帮助工程师完成下面4个方面的功能:启动程序,可以按照工程师自定义的要求随心所欲的运行程序。让被调试的程序在工程师指定的断点处停住,断点可以是条件表达式。当程序被停住时,可以检查此时程序中所发生的事,并追索上文。动态地改变程序的执行环境。在学习linux系统下的调试工具gdb的简单实用之前,我们先引入两个概念便于之后的理解:Debug版本和Ralease版本这里针对的文件类型是:源文件生成的目标文件,可原创 2020-09-06 14:50:45 · 403 阅读 · 0 评论 -
Linux——Makefile文件
Makefile/makefileWindows环境下IDE会自动帮你完成makefile文件的编写,Linux上我们需要自己编写。Makefile文件,我们可以将其理解为一个工程文件的编译规则,描述了整个工程的编译和链接等规则,它定义了一系列规则来指定,哪些文件需要先编译,哪些文件需要后编译,哪些文件需要重新编译,甚至于进行更复杂的功能操作。----Makefile中可以执行操作系统的命令,一旦写好,只需要一个make命令,整个工程完全自动编译,可以使我们的项目工程的编译变得自动化,不需要每次都手原创 2020-09-11 15:42:23 · 1216 阅读 · 0 评论 -
Linux——库文件
库文件某些功能实现的代码集合。例如:C++的标准模板库STL分类静态库在链接过程中,将库中的内容链接合并到最终的可执行文件中,在执行时,不需要静态库的支持。如果对库的内容进行修改,并不会影响之前生成的可执行文件。windows上的文件形式:***.libLinux上的文件形式:***.a共享库在链接过程中,只是给使用到的库中的方法一个标记,可执行文件中并没有包含共享库。在执行时,由操作系统动态加载到内存上。执行时,需要共享库的支持。只要共享库更新了,可执行文件不需要更新,就可以使用新原创 2020-09-26 14:46:47 · 287 阅读 · 0 评论 -
Linux——主函数的三个参数,printf方法的隐藏缓冲区
主函数的三个参数在windows下,c语言的主函数默认有两个参数;很多人会惊奇,这是什么,好像从没有听说过????我们在写C代码的时候都是习惯性的新建空项目然后自己添加.cpp文件,但是可能有部分人习惯直接新建控制台程序,然后可能就会看到这么一段代码,其实两个参数是负责接收指令行参数的,很多在linux gcc或者g++下编译过c程序的人都知道他的指令格式是: gcc 源文件名 -o 生成文件名ps -f也是这个道理。在Linux下,我们的主函数是有三个参数的:int main(int ar原创 2022-01-13 20:54:42 · 417 阅读 · 0 评论 -
Linux——fork进程复制,fork的写时拷贝技术
前言进程是一个运行中的程序,每个进程都有一个进程控制块,英文缩写PCB,Linux系统中的进程控制块是一个结构体strut task_struct实现(PCB是进程存在的唯一标志)数据结构中定义的内容是为后面的管理提供支持的,所以不同的操作系统根据自己的特点又对PCB的内容做了一些调整。一般情况下,PCB中包含以下内容:进程标识符(内部,外部)处理机的信息(通用寄存器,指令计数器,PSW,用户的栈指针)。进程调度信息(进程状态,进程的优先级,进程调度所需的其它信息,事件)进程控制信息(程序原创 2022-01-14 23:54:28 · 1601 阅读 · 0 评论 -
Linux——内存的申请与释放
这篇博客,我们主要解决以下的两个问题:malloc()申请1G的内存能否成功?判断依据是什么?申请了一块空间没有free,进程结束,那么空间是否被回收?如下程序完成编译后,一边运行一边查看资源管理器内存占用变化情况:却发现内存似乎没有发生任何明显的变化,这是为什么呢?因为我们申请了空间而未使用,因此系统并未向我们分配。然而,修改代码后此时内存占用逐渐增大,之后又恢复原样,这是因为进程已经结束,与该进程相关的所有资源都被回收了(被动回收)。那么,假如我们申请超出内存大小的空间呢?初原创 2022-02-14 23:31:09 · 1084 阅读 · 0 评论 -
Linux——操作文件的底层系统调用,探究父子进程是否可以共享文件
linux操作系统奉行一切皆文件的理念,所有文件设备几乎都可以用一套系统调用即open()/close()/write()/read()等来操作。系统调用和C库调用操作文件类似。Linux自带的man手册是最权威的。通过查看man手册来查看系统调用用法。代号 —— 代表的含义1 —— 用户在shell环境下可操作/可执行的命令2 —— 系统内核可调用的函数与工具3 —— 一些常用的函数与函数库,大部分C的函数库4 —— 设备文件的说明,通常是在 /dev下的设备5 —— 配置文件或某些文件的格.原创 2022-01-27 21:26:37 · 1941 阅读 · 0 评论 -
Linux——系统调用和库函数的区别
区别系统调用的实现在内核中,属于内核空间,系统调用的实现是在操作系统中,在编译操作系统的时候,就实现了该方法,所以用户是不可能去执行操作系统的代码,因此它的调用执行和库函数的调用执行是不一样的。库函数的实现在函数库中,属于用户空间,静态库,共享库,其实和我们自己在代码中实现一个方法去调用它,本质上没有什么区别,方法的实现均由用户自己完成。上一篇博客中,我们也提到使用帮助手册查看的时候,不同的代号代表不同的含义比如:fopen是库函数,而open是系统调用凡是要对硬件或者操作系统底层原创 2022-02-14 23:30:09 · 605 阅读 · 0 评论 -
Linux——netstat
netstat是一个功能很强大的网络信息统计工具。它可以打印本地网卡接口上的全部连接、路由表信息、网卡接口信息等。我们主要利用的是上述功能中的第一个,即显示TCP连接及其状态信息。毕竟,要获得路由表信息和网卡接口信息,我们可以使用输出内容更丰富的route和ifconfig命令。netstat命令常用的选项如下:为了深入学习这一命令,也为了演示上一节存在的粘包问题,我们继续使用之前的代码:服务器循环接收数据,客户端循环发送数据:我们将服务器端的代码修改为,一次只接收一个字符的数据: wh原创 2022-03-08 19:57:01 · 330 阅读 · 0 评论 -
Linux ——进程的虚拟地址空间,逻辑地址和物理地址,进程管理命令
进程的虚拟地址空间进程有自己的独立地址空间,每启动一个进程,系统就会为它分配地址空间,虚拟地址空间的大小由计算机的硬件平台决定,比如32位的平台决定了虚拟地址空间为4G(因为32位系统上指针能够寻址的范围是232)这4G空间的分配如下:1.内核空间(1G)驻留在内存内,是操作系统的一部分,内核空间为内核保留,不允许应用程序读写该区域或调用内核代码。2 栈(stack)包括以下内容和用途:1 函数的返回值和参数。2 临时变量,包括非静态局部变量,以及编译器自动生成的临时变量。3 保存上下文原创 2022-01-15 22:23:00 · 4252 阅读 · 0 评论 -
Linux ——objdump和readelf的使用
在一个程序编译结束后,会生成****.o的文件,但往往当我们用vim命令查看这个文件内容时,就全是乱码,像这样:那么我们应该如何查看***.o文件呢?objdump和readelf的使用objdump首先先让我们了解一下什么是odjdump?作用:查看目标文件文件(如.o,.so,可执行文件等)的相关信息或构成。 使用:objdump [参数] filename 关于这一命令各种选项的含义请看:objdump的使用.data数据 :初始化不为0的数据.bss数据 : 未初始化原创 2020-08-22 21:06:34 · 574 阅读 · 0 评论 -
Linux——编译链接原理
在Linux系统下编写完成下面的一段代码后,我们需要通过gcc完成编译和链接那么,gcc是如何具体完成这一过程的呢?为了更加详细地理解这一过程:我们简单地写下如下这样一串代码:1.预编译阶段使用gcc,c文件会生成**.i 文件,c++文件会生成**.ii文件基础命令如下: gcc -E 源文件 -o 要生成的文件名(`**.i`)预编译主要做了以下的事情:1.将所有的 "#define" 删除,并且展开所有的宏定义 2.处理所有条件预编译指令,比原创 2020-08-19 13:24:50 · 1227 阅读 · 0 评论 -
Linux——信号的发送,自己实现结束进程的kill命令
信号的发送Linux提供了一种系统调用(2),不是kill命令:kill() 可以向指定的进程发送指定的信号int kill(pid_t pid, int signType);//signType是要发送的信号kill方法的pid参数有四种不同的情况pid>0,将该信号发送给进程ID为pid的进程pid ==0,将该信号发送给与发送进程属于同一进程组的所有进程,而且发送进程具有向这些进程发送信号的权限pid<0,将该信号发送给其进程组ID等于pid的绝对值的进程,而且发送进程具有原创 2022-02-14 23:33:50 · 744 阅读 · 0 评论 -
Linux——僵尸进程以及僵尸进程的处理
僵尸进程(1)进程中的指令已经执行完成,但是进程PCB结构还没有回收。即子进程先于父进程退出后,子进程的PCB需要其父进程释放,但是父进程并没有释放子进程的PCB,这样的子进程就称为僵尸进程。(2)父进程未结束,子进程结束,但父进程没有处理子进程的退出状态(当子进程先于父进程结束,父进程没有获取子进程的退出码,子进程的PCB会保留一段时间等待父进程在PCB中获取退出码,,且该进程不可执行,此时子进程变成僵尸进程)。直到父进程获取到子进程的退出状态,子进程的PCB才会被移除。我们的程序在退出的时候:原创 2022-01-15 23:58:08 · 11252 阅读 · 0 评论 -
Linux——信号及其使用
信号的基本概念信号是系统响应某个条件而产生的事件,进程接受到信号会执行相应的操作。(软中断信号,用来通知进程发生了异步事件)系统预先定义好的某些特定事件,信号可以被发送,也可以被接受,发送和接受的主题都是进程。与信号有关的系统调用在“signal.h”头文件中有声明常见信号的值,及对应的功能说明:信号的值在系统源码中的定义如下#define SIGHUP 1#define SIGINT 2 //键盘按下 Ctrl+c 时,会产生该信号,即终端终端信号#define SIGQUIT 3#原创 2022-02-14 23:33:39 · 842 阅读 · 0 评论 -
Linux——进程替换
进程替换Linux中新进程的产生并没有使用create创建进程的方法,而是fork——>exec,两步完成一个新进程的创建。先fork一份子进程,再将该子进程替换成你想要执行的程序即可。下面的5个库函数都是通过上面的系统调用实现的。各个参数的含义如下:我们知道Linux中的bash进程实际上是命令解释器由上图可以看出,ps的父进程的的pid是3011,也就是bash。由此,我们也可以呼应开文所说的逻辑:bash将自己fork之后,产生一个子进程,也为bash然后对这个子进程执原创 2022-02-14 23:31:56 · 396 阅读 · 0 评论 -
Linux——进程间通信(管道)
前提同时处理多个业务模块,多个业务模块可能需要相互传递数据,也可能需要同步控制。两个实体需要交互通信,必须有能够共享的资源。磁盘上的文件:——>IO处理,速度慢,且存在不同步的问题。进程通信的应用场景数据传输:一个进程需要将它的数据发送给另一个进程,发送的数据量在一个字节到几兆字节之间。共享数据:多个进程想要操作共享数据,一个进程对共享数据的修改,别的进程应该立刻看到。通知事件:一个进程需要向另一个或一组进程发送消息,通知它(它们)发生了某种事件(如进程终止时要通知父进程)。资源共享原创 2022-03-04 20:05:03 · 1182 阅读 · 0 评论 -
Linux——进程间通信(信号量)
临界资源:同一时刻只能一个进程(线程)访问的资源——>一块物理内存(共享内存),显示终端,打印机。临界区:程序中访问临界资源的代码区域。原子操作:不能被中断的操作。i++不是原子操作,三步操作P,V操作都是原子操作P操作-1操作,临界区之前V操作+1操作,临界区之后信号量:是一个特殊的计数器,来完成多进程环境下进程执行的同步控制。信号量是一个值,当信号量大于0时,记录的是临界资源的个数,此时对信号量执行P操作不会组设,当信号量的值为0时,执行p操作会被阻塞,直到另一个进程对该原创 2020-11-18 15:47:36 · 1527 阅读 · 0 评论 -
Linux——进程间通信(共享内存【mmap实现+系统V】)
共享内存共享内存通过内核对象,使得不同的进程在自己的虚拟地址空间上分配一块空间映射到相同的物理内存空间上,这块物理内存空间对于映射到上面的每个进程而言都是可以访问的。(临界资源)共享内存就是允许两个不相关的进程访问同一个逻辑内存。共享内存是在两个正在运行的进程之间共享和传递数据的一种非常有效的方式。不同进程之间共享的内存通常安排为同一段物理内存。进程可以将同一段共享内存连接到它们自己的地址空间中,所有进程都可以访问共享内存中的地址,就好像它们是由用C语言函数malloc()分配的内存一样。而如果某个进原创 2022-03-05 16:59:39 · 2104 阅读 · 0 评论 -
Linux——进程间通信(消息队列)
消息队列管道和共享内存:字节流数据消息:数据报(类型+数据)队列:优先级队列可以指定类型来读取,在相同类型下,按照先进先出的顺序消息队列的操作:1.创建和访问一个消息队列#include <sys/types.h>#include <sys/ipc.h>#include <sys/msg.h>int msgget(key_t key, int msgflag);key:某个消息队列的名字,给一个整型值即可msgflag:有两个选项IPC_CR原创 2022-03-05 17:37:59 · 1021 阅读 · 0 评论 -
Linux——线程的创建
线程的概念与实现方式线程是进程内部的一条执行序列或执行路径,一个进程可以包含多条线程。执行序列就是一组有序指令得到集合——函数。线程是进程内部的一条执行序列,一个进程至少有一条线程,称之为主线程(main方法代表的执行序列),可以通过线程库创建其他线程(给线程制定一个它要执行的函数),将创建的线程称之为函数线程。线程的实现方式内核级线程(线程的实现(创建、调度、销毁)由操作系统的内核来完成)用户级线程(操作系统内核并不支持多线程,线程的实现都是在用户态)混合级线程(结合以上两种方式实现)原创 2020-12-04 22:30:24 · 19912 阅读 · 2 评论 -
Linux——多线程以及多线程并发访问同一块内存的问题
前言之前我们学习了线程库内置函数的一些使用,接下来我们来讨论多线程在并发执行过程中的一些问题,我们采取访问同一块内存的方式来探究。验证思路对同一个全局变量(初始值为0),使用五个线程函数进行++操作,每个线程函数++1000次,因此,我们5个线程就应该++5000次,最后该全局变量的值应该为5000。然而不同次的尝试执行,却发现最终wg的值有时候是5000,有时候又是4997,4998。原因是:我们对wg++,并不是原子操作,转换为指令,有多条指令构成,计算机执行的二进制的指令对变量的自增这一原创 2022-03-05 20:07:59 · 2452 阅读 · 0 评论 -
Linux——线程同步(互斥锁、信号量、读写锁、自旋锁、条件变量)
前言当多个控制线程共享相同的内存时,需要确保每个线程看到一致的数据视图,若每个线程使用的变量都是其他线程不会读取或修改的,那么就不存在一致性概念,同样地,若变量是只读的,多个线程同时读取该变量也不会有一致性问题,但是当某个线程可以修改变量,而其他线程也可以读取或者修改这个变量的时候,就需要对线程进行同步,以确保它们在访问变量的存储内容时不会访问到无效的数值。正如上一篇博客中写到的那样,对于这个变量的自增,多个线程同时访问一块内存空间时,某个线程还未完成它的操作,另外一个线程也进行了这个操作,导致结果原创 2022-03-06 20:23:31 · 457 阅读 · 0 评论 -
Linux——线程安全
概念线程安全就是在多线程运行的时候,不论线程的调度顺序怎样,最终的结果都是一样的、正确的。那么就说这些线程是安全的。要保证线程安全需要做到:对线程同步,保证同一时刻只有一个线程访问临界资源。在多线程中使用线程安全的函数(可重入函数),所谓线程安全的函数指的是:如果一个 函数能被多个线程同时调用且不发生竟态条件(不出错),则我们称它是线程安全的。下面我们来模拟,主线程分割数字字符串,子线程分割字母字符串这样一个程序:在第二次分割时,我们没有传入要分割的字符串,而传入了NULL,是因为它会沿原创 2022-03-06 21:07:13 · 489 阅读 · 0 评论 -
Linux——多线程中执行fork
前言多线程中某个线程调用 fork(),子进程会有和父进程相同数量的线程吗?父进程被加锁的互斥锁 fork 后在子进程中是否已经加锁?先来解决第一个问题:创建一个线程,有两条路径,一条是主线程,一条是子线程,在主线程加入fork();fork之后,主进程有两个线程,我们来看看子进程究竟有几个线程注意:不管在哪个线程打印pid,pid的值都是整个进程的id号于是:我们发现父进程的pid是5831,子进程的pid是5833,父进程的id在主线程和子线程中均被输出,子进程的id只有在主进程中原创 2022-03-06 22:04:58 · 566 阅读 · 1 评论 -
Linux——网络基础概论
网络基本概念概念网络是由若干结点和连接这些结点的链路组成,网络中的结点可以是计算机,交换机、路由器等设备(即将不同的终端设备连接起来)网络设备:路由器(网络层)、集线器(物理层)、交换机(数据链路层)网络线路:网线(双绞线100m)、同轴电缆、光纤(光信号,不能折)网络上通信的主角网络上通信的主角是运行在不同主机上的两个进程。标识网络中的进程:IP地址+端口号计算机网络体系结构作用——下层为上层提供服务应用层:负责处理应用程序的业务逻辑,为用户提供服务。传输层:控制传输的数据,原创 2020-12-06 20:22:55 · 2287 阅读 · 0 评论 -
Linux——TCP编程流程
TCP编程流程TCP是传输层的一种协议。提供的是面向连接、可靠的、字节流的服务。主机字节序和网络字节序主机字节序列分为大端字节序和小端字节序,不同的主机采用的字节序列可能不同(不同的芯片,所采用的数值存储方式是不同)。大端字节序是指一个整数的高位字节存储在内存的低地址处,低位字节存储在内存的高地址处。小端字节序则是指整数的高位字节存储在内存的高地址处,而低位字节则存储在内存的低地址处。在两台使用不同字节序的主机之间传递数据时,可能会出现冲突。所以,在将数据发送到网络时规定整形数据使用大端字原创 2022-03-07 19:41:20 · 1663 阅读 · 3 评论 -
Linux——TCP协议
前言TCP协议的特点:面向连接的可靠的字节流面向连接客户端与服务器通信之前,使用 TCP 协议通信的双发必须先建立连接,然后才能开始数据的读写,为可靠性传输做好准备。通信完成之后,必须断开连接,以释放系统为链接维护的相关资源。连接的建立与断开三次握手建立连接建立一个TCP连接时,需要客户端和服务器总共发送3个包。进行三次握手的主要作用就是为了确认双方的接收能力和发送能力是否正常、指定自己的初始化序列号为后面的可靠性传送做准备。实质上其实就是连接服务器指定端口,建立TCP连接,并原创 2021-01-07 15:43:11 · 375 阅读 · 0 评论 -
Linux——TCP传输可靠性
TCP传输可靠性的前提条件重传机制:针对数据包丢失或者出现定时器超时确认应答:停止等待协议,发送之后等待收到应答。序列号:针对数据包到达接收端主机顺序乱掉流量控制:针对避免网络拥堵时候;针对高效传输数据包的流动窗口的控制拥塞控制:针对刚开始启动的时候避免一下子发送大量数据包而导致网络瘫痪的慢启动算法和拥塞控制。校验和:发送方和接收方计算校验和并进行对比确认未出错连接管理:三次握手与四次挥手数据的合理分片和排序可靠性传输的要求数据能够完整地到达对方到达的数据不是乱序,不重复到达的原创 2021-01-07 17:34:27 · 165 阅读 · 0 评论 -
Linux——UDP协议及其编程流程
UDP协议的特点无连接不可靠数据报服务UDP的编程流程UDP接口原型接收int recvfrom(int sockfd,void *buf,size_t size,int flag,struct sockaddr *peer_addr,socklen_t *addr_len);peer_addr:用来保存recvfrom接收到的数据是来自哪台主机的地址信息addr_len:地址结构的长度发送int sendto(int sockfd,void *buf,size_t原创 2021-01-13 16:05:17 · 2189 阅读 · 0 评论 -
Linux——IP协议
IP协议是网络层一个协议,IP协议主要来实现报文段在网络环境中的转发。特点:无连接不可靠无状态 ( 指通信双方不同步传输数据的状态信息,因此所有 IP 数据报的发送、传输和接收都是相互独立、没有上下文关系的。)路由器实现就是到网络层,所以每台路由器在转发报文段时,根据IP协议进行转发,而且他只是尽自己最大能力去转发,并不会保证将报文段发送到目的主机。无状态带来的问题无法处理重复的报文段,没有能力进行去重操作接收方接受的IP报文段有可能是乱序的,而且在网络层没有能力对其进行排序IP.原创 2021-01-13 16:30:44 · 229 阅读 · 0 评论 -
Linux——HTTP协议
超文本传输协议(HTTP,HyperText Transfer Protocol)互联网上应用最为广泛的一种网络协议。所有的WWW文件都必须遵守这个标准。设计HTTP最初的目的是为了提供一种发布和接收HTML页面的方法HTTP协议的作用HTTP是一个客户端和服务器端请求和应答的标准,浏览器与后台web服务器之间传递数据(html文件)时控制的协议。区分HTMLHTML超文本标记语言,通过不同的标签来标识数据的不同样式或作用。区分HTTPS一种安全的超文本传输协议,密文形式传输(SSL)H原创 2021-02-01 20:01:15 · 1449 阅读 · 0 评论 -
Linux——I/O复用(1)——select
I/O复用是什么TCP服务器的运行模型根据我们对TCP编程流程的理解:由图可知,客户端1将首先与服务器建立连接,此时客户端2和3也想和服务器建立连接,因为服务器已经与客户端1建立连接并进行交互,所以客户端2和3只能在listen()创建的内核等待队列中等待,因此就产生了一个问题:一个TCP服务器程序只能同时和一个客户端进行交互,其他链接上的客户端只能在TCP服务器的内核队列中等待。I/O复用一个程序可以同时监听多个(上千/万个)文件描述符上是否有事件发生,如果某些文件描述符有事件发生,则原创 2021-02-09 23:11:52 · 367 阅读 · 0 评论 -
Linux——I/O复用(2)—— poll和epoll
poll原型poll系统调用和select类似,也是在指定时间内轮询一定数量的文件描述符,以 测试其是否有就绪者。int poll(struct pollfd *fds, int nfds, int timeout);fds: struct pollfd类型的数组, 用来传递用户关注的文件描述符以及事件类型 struct pollfd{ int fd; // 文件描述符 short events; // 关注的事件类型 如果关注多种事件类型,可以使用按位或‘|’将这些事件合到一起原创 2021-02-15 22:56:37 · 1284 阅读 · 0 评论