
Linux
文章平均质量分 90
CR0712
welcome to C
展开
-
C语言程序环境(翻译+执行)
我们对C语言有了一定的了解之后会不会思考,我们写出来的源文件通过怎样的处理就在黑框框中显示出来, 变得可执行了呢?原创 2023-04-03 17:29:17 · 638 阅读 · 1 评论 -
程序运行与动态库
当我们写好了一段代码然后编译运行后会生成可执行文件,该文件会存在磁盘的当前目录下,而当我们开始运行这段程序时,操作系统(加载器)需要将其从磁盘加载进内存然后执行相关操作。以下的讲解以Linux操作系统为例。原创 2024-12-02 21:05:06 · 1135 阅读 · 0 评论 -
高级IO之IO多路转接
高级I/O(Advanced I/O)是指在计算机系统中进行输入和输出操作时使用的一种更高级的接口和技术。也就是当我们进行输入输出的时候本质其实都要进行等待内核缓冲区中数据到来才能进行读取和写入到用户缓冲区。而往往在等待的阶段都是需要进行阻塞的。而高级I/O提供了比传统的基本I/O操作更丰富和灵活的功能。原创 2024-10-12 22:10:25 · 1164 阅读 · 0 评论 -
NAT技术+代理服务器+内网穿透
IPv4协议中,会存在IP地址数量不充足的问题,所以不同的子网中会存在相同IP地址的主机。那么就可以理解为私有网络的IP地址并不是唯一对应的,而公网中的IP地址都是唯一的,所以NAT(Network Address Translation,网络地址转换)技术是当前解决IP地址不够用的主要手段, 是路由器的一个重要功能。原创 2024-09-07 12:09:42 · 1272 阅读 · 0 评论 -
数据链路层以太网技术与DNS、ICMP协议
主域名是用来识别主机名称和主机所属的组织机构的一种分层结构的名称,如:www.baidu.comcom: 一级域名. 表示这是一个企业域名. 同级的还有 "net"(网络提供商), "org"(非盈利组织) 等.baidu: 二级域名, 公司名.www: 只是一种习惯用法. 之前人们在使用域名时, 往往命名成类似于ftp.xxx.xxx/www.xxx.xxx这样的格式, 来表示主机支持的协议.原创 2024-09-05 21:23:05 · 897 阅读 · 0 评论 -
网络层IP协议报头字段的认识
私有IP地址主要用于内部网络的互连和通信,而公网IP地址则用于设备在Internet上的唯一标识和通信。在实际应用中,通常会通过NAT等技术将内部网络的私有IP地址转换为公网IP地址,以实现内部设备与Internet的通信。原创 2024-08-09 20:50:16 · 1366 阅读 · 0 评论 -
传输层udp和tcp协议格式
服务端起初是LISTEN监听状态,当客户端向服务端建立连接时发送SYN标志位的报文时,就会将状态从CLOSED状态转变成为SYN_SENT而服务端接收到客户端的连接请求后就会设置当前状态为SYN_RESD,而此时客户端会返回SYN+ACK标志位字段的报文给客户端,所以此时客户端成功收到后就会设置为ESTABUSHED状态,最终客户端返回ACK被服务端接收后,服务端也会设置状态为ESTABUSHED状态,至此双方算是成功建立好连接。它通过确认报文(ACK)中的窗口大小字段告诉发送端它可以接收的数据空间大小。原创 2024-06-15 16:00:38 · 1206 阅读 · 0 评论 -
应用层协议HTTP与HTTPS
HTTP(Hypertext Transfer Protocol,超文本传输协议)和HTTPS(Hypertext Transfer Protocol Secure,超文本传输安全协议)都是用于在Web上传输数据的协议,但它们之间存在一些重要的差异,特别是在安全性和加密方面。HTTP:是不安全的,传输的数据都是未加密的明文。这意味着在传输过程中,任何在路径上的设备都可以读取或篡改数据。HTTPS:是安全的,通过传输加密和身份认证保证了传输过程的安全性。原创 2024-05-29 21:46:21 · 1328 阅读 · 0 评论 -
基于tcp实现自定义应用层协议
在自定义协议时必须让客户端与服务器都能够看到同一份协议字段,这样才能在接收数据的时候按照规定的格式进行准确无误的接收。对于序列化的字段格式采用空格作为分隔符。而反序列化的时候就可以通过空格分隔符将数据提取出来。// 模拟定协议// 添加报头数据和解报头mes = ret;// 先判断收到的数据是否完整// 指向第一个换行符// 指向第二个换行符// 解包后的数据// 去掉被读走的数据public:"原创 2024-05-26 17:43:39 · 1154 阅读 · 0 评论 -
网络编程套接字和传输层tcp,udp协议
我们知道在网络数据传输的时候,在IP数据包头部有两个IP地址,分别叫做源IP地址和目的IP地址。IP地址是帮助我们在网络中确定最终发送的主机,但是实际上数据应该发送到主机上指定的进程上的,所以我们不仅要确定主机,还要确定主机上的指定进程。而标识该进程的就是通过端口号。所以IP+端口号port就能标识互联网中唯一的一个进程。原创 2024-05-09 15:30:08 · 1451 阅读 · 0 评论 -
计算机网络基础
网络通常指的是用一个巨大的虚拟画面将所有东西连接起来。在计算机领域中,网络是通过物理链路将各个孤立的工作站或主机相连在一起,组成数据链路,从而达到资源共享和通信的目的。网络通信特指终端设备之间通过计算机网络进行的通信。原创 2024-05-05 21:03:55 · 1337 阅读 · 1 评论 -
线程池+日志(纯代码)
【代码】线程池+日志(纯代码)原创 2024-04-06 20:51:10 · 324 阅读 · 0 评论 -
Linux下对线程的认识+生产消费者模型+信号量
所以当我们的多线程竞争锁时,竞争成功的线程首先进来将数字0 move到al寄存器中,然后将al寄存器内的数据和mutex进行交换(而mutext的默认值都是1),所以此时al寄存器的内容就是1,而mutex数据的值就等于0,则进入if语句线程上锁成功,其他线程进来后也会从头执行相应的汇编代码,但是此时mutex的值还是0所以最终就会在else中挂起等待。所以我们的线程切换是。因为线程中对每种信号的处理方式都是共享的,也就是handler表共享,所以一个线程崩溃的话,其他线程就会执行相同的处理方法。原创 2024-03-22 20:19:05 · 1139 阅读 · 0 评论 -
页表认识:虚拟地址->物理地址映射
地址空间的大小取决于系统的架构和操作系统的实现。在32位系统中,地址空间大小为2的32次方(约为4GB)。而在64位系统中,地址空间大小为2的64次方。进程地址空间的划分使得不同的数据和代码可以在不同的区域中进行管理和保护。不同的区域具有不同的访问权限和特性,例如代码段是只读的,堆和栈是可读写的。进程地址空间也是更加便于操作系统进行管理,如虚拟内存管理、内存映射和安全性等功能。原创 2024-03-18 21:37:20 · 420 阅读 · 0 评论 -
linux中对信号的认识
但是一些信号,如9号信号不能被自定义捕捉修改。原创 2024-03-04 15:02:26 · 871 阅读 · 0 评论 -
使用管道和system V进行进程间通信
然后分别在父子进程中关闭关闭其不需要的操作文件方式,此时关闭并不会直接将文件给关闭,因为我们文件的指向是采用引用计数的方式的,所以关闭进程的文件,只会使引用计数--,只有减到0才会真正的关闭文件。我们首先创建管道(实质就是打开同一个文件两次,形成两个文件描述符),然后再fork创建子进程,那么子进程会拷贝文件描述符表中的内容,此时,父子进程文件描述符表中的文件指针所指向的就是同一个文件,继续fork继续拷贝...但是我们发现,我们的结果是按照顺序读写的,也就是子进程写完一份内容,父进程才会读取一份内容。原创 2024-02-26 15:30:32 · 907 阅读 · 0 评论 -
动态库和静态库的理解 Linux
其实库文件里面的内容就是函数的实现方法,向我们包含的头文件其实就是函数的生命,而我们编译链接程序时会自动加载库文件,最终形成可执行程序。其实我们在编译链接时不仅仅会将文件的库文件加载进来,其实头文件也是需要加载进来的,只不过也是自动加载的。原创 2024-01-24 16:44:00 · 1068 阅读 · 1 评论 -
磁盘的分区与文件系统的认识
了解磁盘的结构:1、盘片硬盘首先会有多个盘片构成,类似很多个独立的光盘合并在一起,每个盘片都有2个面,每个盘片都有一个对应的磁头,我们的磁头横移和盘面的旋转就可以读写到盘面的每一个位置,而我们的磁盘数据实际上就是在盘面上保存的。2、扇区和磁道每个盘片会分成若干个相同同心圆的磁道,磁道从外围开始编号,从0开始,每个磁道又会划分成若干个扇区,扇区是硬盘的最小存储单元,一般是存储512字节。3、磁头和柱面磁头用于读取盘面中磁道内的扇区中存储的数据。原创 2024-01-21 23:04:37 · 1269 阅读 · 0 评论 -
用Linux的视角来理解缓冲区概念
缓冲区(buffer)是存储数据的临时存储区域。当我们用C语言向文件中写入数据时,数据并不会直接的写到文件中,中途还经过了缓冲区,而我们需要对缓冲区的数据进行刷新,那么数据才算写到文件当中。而缓冲区通常是一块内存区域,可以是数组、队列、链表等数据结构。原创 2024-01-10 20:07:20 · 1094 阅读 · 0 评论 -
进程程序替换与exec系统调用
进程程序替换是指将一个正在运行的进程替换为另一个可执行程序。它的本质是调用了Linux操作系统中的exec系统调用。而exec系统调用是一个家族函数,例如execlexecvexecleexecve等。它们的共同特点是当当前进程执行到该函数时,就会直接跳转到新的程序并开始执行新的可执行文件。原创 2023-11-18 19:01:38 · 454 阅读 · 1 评论 -
什么是进程等待?
当一个进程正常退出或者被终止时,其所占用的系统资源会被操作系统及时回收释放,而其退出状态(退出码)会被传递给其父进程。然而,如果父进程没有合理处理该状态,那么子进程将会变成一个僵尸进程。僵尸进程会占据系统资源,也就是僵尸进程的退出信息等资源,避免僵尸进程的产生:父进程通过调用 wait() 或 waitpid() 系统调用来处理已经终止的子进程,也就是处理僵尸进程所占据的资源信息。原创 2023-11-10 23:53:18 · 258 阅读 · 0 评论 -
Linux下进程地址空间初步理解
我们的每一个进程地址空间都是经过区域分区的,每个区域的数据种类不同,而为了对进程地址空间做管理则必然是有一个类似于PCB(进程控制块)的的结构体,而这个结构体的名称就是mm_struct,而这个结构体里用long long类型的变量存放了有关进程地址空间的所有区域地址划分(也就是每个区域(例如栈区)的起始位置),而区域之间的地址可以被我们直接用来使用,也正是虚拟地址。而进程PCB中也有一个指针指向这个结构体。所以此时对进程地址空间就有了一个全新的理解,原创 2023-10-27 18:58:48 · 375 阅读 · 0 评论 -
Linux下的命令行参数和环境变量
所以说我们自己的可执行程序要带上路径才能执行就是因为我们的程序不在PATH环境变量下的路径当中。其实linux下的指令是有默认搜索路径的,也就是当你使用该指令时,linux会自动在默认路径里面去找而该默认路径是什么呢?其实这是一个全局的二级字符指针,指向的正是环境变量表中的内容(也就是指向char*[]的类型)所以无论哪里我们都可以通过该指针去访问环境变量列表里的内容。用于指定可执行程序的搜索路径,当输入一个不带路径的命令时,系统会默认在PATH的内容中按照顺序在路径列表中查找可执行程序的所在路径。原创 2023-10-20 09:29:42 · 2737 阅读 · 1 评论 -
Linux操作系统下进程状态的理解
我们知道进程会有属于自己的PCB,便于操作系统的管理,而PCB结构体里面还有进程状态参数,类似于用一个变量标识对应的进程状态,就相当于将每个进程状态编号,而PCB中有一个变量存储当前进程状态所对应的编号,也就表明当前进程对应的具体状态,好让操作系统看到具体的状态,并对其更好地进行操作。原创 2023-10-08 20:13:24 · 164 阅读 · 0 评论 -
对进程的初步认识以及fork()函数的理解
进程是什么呢?其实解释的通俗浅显一点就是我们运行到内存的程序。我们知道运行一个磁盘里的程序时,会将该程序先加载(将磁盘的数据拷贝)到内存当中,因此该程序就可以称为一个进程。首先我们以Windows操作系统为例, 可以快捷键查看当前正在运行的进程:Ctrl+shift+Esc。原创 2023-10-03 10:16:08 · 221 阅读 · 1 评论 -
Linux下进度条程序实现以及自动化构建工具makefile的实现和对回车键的理解
在实现进度条之前我们要了解一些有关实现进度条的知识。例如回车与换行和makefile的使用。原创 2023-09-18 21:27:39 · 457 阅读 · 2 评论 -
Linux下生成可执行程序的每一步过程以及链接库的初步认识
而头文件展开是干啥呢,这里就要大略的谈谈头文件和库文件了,头文件就是我们的stdio.h,而我们包含的这个头文件功能起到一些函数、变量类型定义的作用,而函数的具体实现是在库文件里的,例如我们的printf函数也是需要实现的,就是在stdio.h定义的,如果我们要使用函数的话,编译器就需要到特定的库文件中去寻找该函数的实现,而库文件的内容实质上都是一些二进制。就以C语言代码为例,当我们写好了一份C语言代码,第一部要进行头文件的包含,然后在主函数下咔咔一顿写,再开始翻译,也就是形成可执行程序的过程.原创 2023-09-12 22:46:43 · 809 阅读 · 2 评论