最新一文让你理解网络阻塞与非阻塞和多路io复用
Socket
未读主线是什么主线是什么首先为什么需要我们的网络多路复用,阻塞和非阻塞,因为我们需要考虑效率,而客户端和服务端一对一通信显然是不会陷入效率问题,而真正会产生效率问题是因为我们的多线程处理并发的场景,因此主线就是多线程中的主线程和子线程
阻塞在阻塞什么阻塞在阻塞什么函数分析我们不妨分析一下所有的 socket 函数,看看什么适合主线程,什么适合子线程。首先 socket 函数创建的是一个 sock 结构体,交给内核管理然后是 bind 函数给 sock 绑定 ip 和端口之后是 listen 函数初始化半连接队列和全连接队列,并且初始化 sock 状态再然后是 accept 函数从全连接队列中获取 sock 的 fdRecv 函数通过这个 fd 获得 sock 中缓冲区的内容,并加以处理Send 函数通过 fd 获得 sock 中缓冲区的位置,并开始写,又由内核发送
哪些阻塞?
socket():这个函数用于创建一个新的 socket,这个过程通常是非阻塞的。
bind():这个函数用于将 socket 绑定到一个特定的 IP 地址和端口号,这个过程也是非阻塞的。
listen():这个 ...
前言前言本文记录关于我这一年的学习情况,大多数以obsidian的笔记作为主线,希望通过这条主线快速地回顾这一年的进程。
回顾回顾2023
04-10
CSAPP
05-7
数据结构
08-10
侯捷面向对象
09-18
c++ Primer
09-25
侯捷STL源码剖析
10-1
Effective modern C++
10-20
Effective C++
11-10
计算机网络
11-25
More effective c++
12-05
拥有第一个博客
12-13
拥有第二个博客
12-23
CS144
12-30
git学习
2024
1-7
CMake学习
1-7
图论
心里话心里话回顾这一年我感觉学得是挺多的,但是很多的书籍仍然需要去沉淀,慢慢挖掘其中的深邃。然后对于平时,个人感觉也是挺水的,如果多努力一点可能能对知识掌握更深更广。希望24年能更好的努力吧,项目是一个没做,太卢瑟了,加油加油!
CMake
未读前言前言这部分是关于如何入门地通过cmake使用opencv
实践实践首先你需要在文件下创建:main.cpp 的源码如下
1234567891011121314151617181920212223242526272829303132333435363738394041#include <iostream>#include <opencv2/opencv.hpp> using namespace std;using namespace cv; int main(){ Mat srcImg = imread(".jpg"); // 尝试读取图片 if (srcImg.empty()) { // 检查图片是否正确载入 cerr << "Error: Image cannot be loaded!" << endl; return -1; } string windowName = "Image Displ ...
CMake
未读前言前言本文只是关于如何配置他人已经包装好的软件配置路径。由于每一个电脑的安装路径都不一样,所以如果为了保证 CMakelists.txt 可以在其他电脑上复用,需要用到环境变量,代替曾经用绝对路径的情况
配置配置配置需要通过 find_package(OpenCV REQUIRED) 到环境变量中从上到下依次寻找路径,找到便退出。
在我们的 xxx.cmake 中会有关于如何设置 CMakelists.txt 的配置例如 OpenCV 的 OpenCVConfig.cmake :
将他们找到,然后注意三个部分,find_package 找到路径 add_executable 写可执行文件 target_include_directories 链接头 target_link_libraries 链接库
1234567find_package(OpenCV REQUIRED)add_executable(lesson4_opencv main.cpp)target_include_directories(lesson4_opencv PRIVATE ${OpenCV_INCL ...
CMake
未读
指令
描述
推荐
备注
include_directories
在构建目标之前,为所有的目标添加头文件搜索路径。
非 target-specific,会影响整个 CMake 项目的所有目标。
target_include_directories
为特定的构建目标添加头文件搜索路径。
✅
target-specific,只影响指定的目标。
link_directories
在构建目标之前,添加库文件搜索路径。
非 target-specific,会影响之后定义的所有目标。但通常不推荐使用,因为它不提供精确的依赖关系。
target_link_libraries
为特定的构建目标链接一个或多个库。
✅
target-specific,只影响指定的目标,并且可以指定私有(PRIVATE)、接口(INTERFACE)或公共(PUBLIC)链接。
add_definitions
添加编译器定义(如预处理器定义)。
非 target-specific,会影响整个 CMake 项目的所有目标。
target_compile_definitions
为特定目标 ...
前言前言这节课中的依赖是狭义的认为不需要提供的库不链接,换一句话说只有当前库中有调用另一个库的函数那么构成依赖。
预览做法是将源代码文件(在这个案例中是 .cpp 文件,对于 C 项目将是 .c 文件)编译并打包成库文件。然后添加访问权级,让库可以被其他部分的项目代码链接和使用。Cmake 权级如下:
范围
目标构建时
链接目标时
描述
PRIVATE
是
否
目标私有,库或路径仅用于构建当前目标,在当前目标的外部不可见。
INTERFACE
否
是
目标接口,用于目标接口的库或路径不直接用于构建目标,但会传递给链接此目标的其他目标。
PUBLIC
是
是
两者兼而有之,库或路径用于构建当前目标,且会传递给任何链接了该目标的其他目标。
课程文件课程文件以下是(比飞鸟贵重的多_HKL)up 教程里的各个文件代码add.hh
12#pragma onceint add(int a, int b);
add.cpp
12345678910#include "common.h"int add(int x, int y){ ...
前言 :前言 :通过之前的文章应该了解到 linux 系统和 win 系统对于构建 cpp 文件的差别也是很大的。这里补充一下执行文件的不同之处:
CMake在linux和win的运行执行文件不同之处CMake在linux和win的运行执行文件不同之处Linux 的优点Linux 下是有保存同级 CMakelists.txt 的 target_link_libraries 路径而 windows 是没有保存路径的 .exe 必须要配合 .dll 文件,linux 的可执行文件是可以自寻路径的
Windows 搜索路径通过隐式和显式链接,Windows 首先搜索“已知 DLL”,如 Kernel 32. Dll 和 User 32. Dll。Windows 然后按下列顺序搜索 DLL:
当前进程的可执行模块所在的目录。
当前目录。
Windows 系统目录。GetSystemDirectory 函数检索此目录的路径。
Windows 目录。GetWindowsDirectory 函数检索此目录的路径。
PATH 环境变量中列出的目录。
Linux 搜索路径Linux 搜索路径Li ...
前言前言相比较于静态库,动态库需要的是得到一些运行时的量,这是和静态库本质的区别
实现动态库实现动态库
确认平台
我们配置动态库要注意是在什么平台下,如果是在 win 下需要有静态库作为帮手,把动态库导入
Windows 和 Linux 在处理静态库和动态库(也称为共享库)时有一些差异,这主要归因于它们的链接和加载机制的不同。这些差异影响了在各自平台上构建和运行程序的方式。
Windows 平台:Windows 平台:
静态库(. Lib):
在 Windows 上,静态库通常以 .lib 文件形式出现。
当程序编译时,静态库的内容被复制到最终的可执行文件(.exe)中。
因此,部署时不需要静态库文件,因为所有必需的代码都包含在 .exe 文件内。
动态链接库(DLL,. Dll):
动态链接库(Dynamic Link Libraries, DLLs)是 Windows 上的共享库。
程序在运行时动态地链接到这些库,而不是在编译时。
这意味着,为了运行程序,必须有相应的 .dll 文件在可访问的路径上,例如程序所在目录或系统目录。
在 Windows 上,有时即使 ...
前言前言我们知道 c.cpp c. hh 两个文件会经过编译,然后生成机器码文件,而静态库的作用就是保存机器码,一方面是保证了安全性,另一方面是不用再次编译(但是跨平台肯定是不行的)
如何生成静态库如何生成静态库add_library(静态库名字 STATIC 静态库.cpp文件)add_library(add_static STATIC add.cpp)
静态库的完整过程静态库的完整过程
编译 add.cpp 生成静态库: 当通过命令添加一个库时,CMake 会为适用的源文件生成一个编译指令 add_library(add_static STATIC add.cpp)。在这种情况下,它将 add.cpp 编译文件并创建一个名为 add_static 的静态库(在 Windows 上通常是 add_static.lib,在 Unix-like 系统中是 libadd_static.a)。
编译 main.cpp 生成对象文件: add_executable(main main.cpp) 命令告诉 CMake 对 main.cpp 文件进行编译,生成一个对象文件 main.o( 或 m ...
前言前言首先,可以思考一下,如果我们要去管理一堆文件,那么我们需要以何种关系结构去处理呢?如果这个问题换做是管理员工,管理学生呢?
其实这就是 CMake 文件的联系关系的思想,通过分层管理来间接获取到每一个文件,类似于框架图
介绍介绍所以我们首先需要定义一个最顶层的 CMakelist,管理版本号,以及多个
类似于
一层
CMakelist
二层
项目 1
CMakelist
项目 1_1
CMakelist
项目 1_2
CMakelist
项目 2
CMakelist
项目 3
CMakelist
项目 4
CMakelist其中通过 add_subdirectory 让上层知道下层的目录位置例如在寻找库的过程 (只是举个例子先不要在意库是什么):
实操实操对于第一次编译 add. cpp 文件的过程进行扩展,结构如下其中最底下的 CMakelists.txt 是顶层,sub 实现的是减法,mul 乘法在 add 子目录,和之前的加法实现就基本上一样,这里给出 CMakelists.txt 的配置顶层 CMakelists.txt
123456 ...