c++
WeinKee
这个作者很懒,什么都没留下…
展开
-
c++ 语言技巧之traits
TraitsTraits技术是STL中比较常见的一种C++语言技巧表达方式之一,通过C++模板的能力,将对象类型萃取出来,让同一个接口实现对应的功能。特别是在算法和容器中,可以解耦出具体的对象类型,使得两者通过迭代器实现链接。Traits技巧之入门C++中通过使用迭代器,将STL中的容器和算法相解耦,在C++中编译器编译器需要考虑相应的型别判断。首先我们通过模板获取形参的数据类型在这里插入代码片...原创 2020-07-07 23:34:27 · 1002 阅读 · 0 评论 -
Linux下I/O复用模型
以下内容引述至《Linux/Unix系统编程手册》整体概览常见的程序使用的I/O模型都是单个进程每次只在一个文件描述符上执行I/O操作,每次I/O系统调用会阻塞直到完成数据传输。对于许多应用来说,传统的阻塞式I/O模型已经足够了,但这不代表所有的应用都能得到满足。如果可能的话,以非阻塞的方式检查文件描述符上是否可进行I/O操作同时检查多个文件描述符,看它们中的任何一个是否可以执行I/O操作满足这些技术需求的方案是:非阻塞式I/O 和 多进程或多线程技术非阻塞式I/O可以让我们周期性地检查原创 2020-06-27 13:35:15 · 323 阅读 · 0 评论 -
Linux socket 高级主题
以下内容引述自《Linux/Unix系统编程手册》流式套接字上的部分读和部分写如果套接字上可用的数据比在read()调用中请求的数据要少,这种情况下,read()直接返回可用的字节数。如果没有足够的缓冲区空间来传输所有请求的字节,并且满足了如下的几条中的其中一条时,可能会出现部分写的现象。在write() 调用中传输了部分请求的字节后被信号处理例程中断;套接字工作在非阻塞模式下(O_NONBLOCK),可能当前只能传输一部分请求的字节;在部分请求的字节已经完成传输后出现了一个异步错误。对于这里原创 2020-06-26 14:12:22 · 190 阅读 · 0 评论 -
Linux Socket Internet Domain
一下内容引述直《Linux/Unix系统编程手册》Internet Domain SocketInternet Domain流socket是基于TCP之上的,他们提供了可靠的双向字节流通信信道。原创 2020-06-19 09:19:52 · 231 阅读 · 0 评论 -
Linux网络socket: TCP/IP网络基础
以下内容引述至《Linux/Unix系统编程手册》互联网协议和层联网协议通常会被组织成一系列的层,其中每一层都构建与下层之上并提供特性以供上层使用。ARP:地址解析协议关注的是如何将因特网地址映射到硬件地址ICMP:用来在网络中传输错误和控制信息(ping和traceroute程序使用),主机和路由器使用因特网组管理协议来支持IP数据报的多播封装封装是分层联网协议中的一个重要的原则。封装中的概念是低层会将从高层向低层传递的信息当成不透明的数据来处理。换言之,低层不会尝试对高层发送过来的信息进行解原创 2020-06-11 09:15:10 · 204 阅读 · 0 评论 -
Linux Socket Unix Domain介绍
以下内容引述至《Linux/Unix系统编程手册》Unix domain socket允许同一系统上不同进程之间相互通信的一种方式Unix domain socket地址在Unix domain中,socket地址以路径名来表示,domain特定的socket地址结构的定义如下所示:struct socketaddr_un { sa_family_t sum_family; char sun_path[108];}sockaddr_un 结构中字段 sun_前缀是根据socket unix原创 2020-06-10 21:41:49 · 857 阅读 · 0 评论 -
Linux静态库与动态库简介
以下内容引述至《Linux/Unix系统编程手册》静态库静态库被称为归档文件,它是Unix系统提供的第一种库。静态库能带来以下好处:可以将一组经常被用到的目标文件组织进单个库文件,这样就可以使用它来构建多个可执行程序并且在构建各个应用程序的时候无需重新编译原来的源代码文件;链接命令变得更加简单。在链接命令行中只需要指定静态库的名称即可,而无需一个个地列出目标文件了。链接器知道如何搜索静态库并将可执行程序需要的对象抽取出来从结果上看,静态库实际上就是一个保存所有被添加到其中的目标文件的副本的文件原创 2020-05-31 11:49:35 · 263 阅读 · 0 评论 -
Linux线程更多细节
以下内容引述至《Linux/Unix系统编程手册》线程栈创建线程时,每个线程都有一个属于自己的线程栈,且大小固定,除主线程外的所有线程,其栈的缺省大小均为2MB,也可以调用pthread_attr_setstack()设置线程属性决定线程站的大小。线程和信号Unix信号模型是基于Unix进程模型而设计的,问世比Pthread要早几十年。所以信号与线程模型之间存在一些明显的冲突。主要是因为一方面,针对单线程进程要保持传统的信号语义,于此同时,又需要开发出使用与多线程进程环境的新信号模型。Unix信号原创 2020-05-27 09:15:15 · 233 阅读 · 0 评论 -
Linux线程安全和线程存储
以下内容引述至《Linux/Unix系统编程手册》可重入性若函数可同时供多个线程安全调用,则称之为线程安全函数;反之,如果函数不是线程安全的,则不能并发调用。实现线程安全有多种方式。其一是将函数与互斥量关联使用,在调用函数时将其锁定,在函数返回时解锁,对函数的访问是串行的;另一种方式是将共享变量与互斥量关联起来。可重入函数无需使用互斥量即可实现线程安全。线程特有数据实现函数线程安全最为有效的方式就是使其可重入。要使用线程特有数据,库函数执行的一般步骤如下:函数创建一个键(key),用以将不原创 2020-05-27 00:07:07 · 151 阅读 · 0 评论 -
Linux线程同步基础
以下内容引述至《Linux/Unix系统编程手册》线程同步方式互斥量 和 条件变量互斥量一般情况下,对每一共享资源(可能由多个先关变量组成)会使用不同的互斥量,每一个线程在访问同一资源时将采用如下协议针对共享资源锁定互斥量访问共享资源对互斥量解锁#include <pthread.h>int pthread_mutex_lock(pthread_mutex *mutex);int pthread_mutex_unlock(pthread_mutex *mutex);in原创 2020-05-26 00:00:13 · 116 阅读 · 0 评论 -
Linux线程初步介绍
以下内容引述至《Linux/Unix系统编程手册》线程Pthread API 定义了一干数据类型数据类型描述pthread_t线程IDpthread_mutex_t互斥对象pthread_mutexattr_t互斥属性对象pthread_cond_t条件变量原创 2020-05-25 23:08:20 · 122 阅读 · 0 评论 -
Linux进程创建&终止&等待&执行
以下内容引述《Linux/Unix系统编程手册》fork、exit、wait、execvefork()系统调用fork允许父进程创建子进程,子进程获取父进程的栈、数据段、堆和执行文本段的拷贝子进程会获得父进程所有的文件描述符的副本。这些副本的创建方式类似于dup(),这也意味着父、子进程中对应的描述符均指向相同的打开文件句柄。内存语义:内核将每一进程的代码段标记为只读,从而使进程无法修改自身代码。系统调用fork为子进程创建代码段时,其所构建的一系列进程级页表项均指向与父进程相同的物理内存页原创 2020-05-22 08:15:58 · 381 阅读 · 0 评论 -
Unix/Linux系统信号详解-初入信号概念
以下内容引述《Linux/Unix系统编程手册》信号信号是事件发生时对进程的通知机制。有时也成为软件中断。信号与硬件中断的相似之处在于打断了程序执行的正常流程。发往进程的诸多内核,通常都是源于内核。引发内核为进程产生信号的各类事件如下:硬件发生异常,即硬件检测到一个错误条件并通知内核,随即再由内核发送相应信号给相关进程;用户键入了能够产生信号的终端特殊字符;发生了软件事件,比如调整了中断窗口大小,定时器到期,进程执行CPU事件超限等针对每个信号,都定义了一个唯一的整数,从1开始顺序展开原创 2020-05-13 09:36:05 · 280 阅读 · 0 评论 -
Linux内存分配
以下内容引述《Linux/Unix系统编程手册》堆上分配内存进程可以增加堆的大小来分配内存,所谓堆是一段长度可变的连续虚拟内存,始于进程的未初始化数据段末尾,随着内存的分配和释放而增减。通常将堆的当前内存边界称为"program break"调整program break改变堆的大小,就像命令内核改变进程的program break位置一样。最初,program break正好位于未初始化数据段末尾之后。在程序加载program break位置之后,内核会在进程试图访问这些虚拟内存地址时自动分配新原创 2020-05-10 12:51:22 · 214 阅读 · 0 评论 -
Linux进程
以下内容引述《Linux/Unix系统编程手册》进程程序是包含了一系列信息的文件,这些信息描述了如何在运行时创建一个进程二进制格式标志:每个程序文件都包含用于描述可执行文件格式的元信息,内核用此信息来解释文件中的其他信息;机器语言指令:对程序算法进行编码;程序入口地址:标志程序开始执行时的起始指令位置;数据:程序文件包含的变量初始值和程序使用的字面常量值;符号表以及重定位表:描述程...原创 2020-05-08 08:24:39 · 132 阅读 · 0 评论 -
Unix/Linux系统编程概念
以下内容引述<Unix/Linux系统编程手册>系统调用系统调用是受控的内核入口,进程可以请求内核以自己的名义去执行具体动作。系统调用将处理器从用户态切换为核心态,以便CPU访问受保护的内核内存;系统调用的组成是固定的,每个系统调用都是由一个唯一的数字来标志;每个系统调用可辅以一套参数,对用户空间(进程虚拟地址空间)与内核空间之间(相互)传递的信息加以规范系统调用步骤...原创 2020-05-03 00:05:21 · 220 阅读 · 0 评论 -
windows线程栈
以下内容引述《windows核心编程》线程栈当系统创建线程时,会为线程栈预定一块地址空间区域(每个线程都有自己的栈),并给区域调拨一些物理存储器。默认情况下,系统会预定1MB的地址空间并调拨2个页面的存储器。也可以通过编译器选项控制 MicroSoft C++编译器的/F选项,或者MSVC链接器的/STACK 选项/Freserve/STACK:reserve[, commit]链接器...原创 2020-05-02 11:13:59 · 274 阅读 · 0 评论 -
windows未处理异常
以下内容引述《windows核心编程》未处理异常异常过滤函数返回EXCEPTION_CONTINUE_SEARCH,系统会继续在调用树的上层寻找异常过滤函数。如果每个异常过滤程序都返回EXCEPTION_CONTINUE_SEARCH,我们就会遇到所谓的未处理异常。微软提供了函数SetUnhandleExceptionFilter,它给我们处理异常的最后机会,否则widows会正式认为这个异...原创 2020-04-26 23:45:03 · 901 阅读 · 0 评论 -
windows异常处理程序与软件异常
以下内容引述《windows核心编程》异常异常分为硬件异常和软件异常硬件异常CPU负责捕获类似非法内存访问和以0作为除数这样的问题,一旦侦测到这些错误行为,它会抛出相应的异常。由CPU抛出的异常都是硬件异常软件异常操作系统和应用程序抛出的异常,是软件异常__try{// Guard body...}__except{// Exception handler...}...原创 2020-04-23 09:23:30 · 516 阅读 · 0 评论 -
windows终止程序
本文内容引述至《windows核心编程》结构化异常处理SEH结构化异常处理(structed exception handling, SEH)Microsoft Visual C++ 支持异常处理,它在内部实现上其实就是利用了编译器和Windows操作系统的结构化异常处理功能。SEH实际上包含两个功能:终止处理和异常处理。终止处理终止处理程序确保不管一个代码块(被保护代码)是如何退出的...原创 2020-04-21 23:34:24 · 800 阅读 · 0 评论 -
windows注入续讲
本文内容引述至《windows核心编程》DLL注入Dll注入除了使用前文《windows注入》中所推荐的三种方法修改注册表HookRemoteThread还有其他的注入方式木马注入DLL木马注入常见的黑客手法,把预知常见的进程必然载入的DLL库同名替换。Dll库除了名字要相同,还有原来DLL中导出的所有符号,而且随着替换的Dll版本发生变化,更改了导入表甚至是导入地址,那么这...原创 2020-04-19 16:01:30 · 245 阅读 · 0 评论 -
windows线程局部栈
TLS本文内容引述《windows核心编程》TLS Thread Local Storage需求软件开发中,需要将数据与一个对象的实例关联起来。如使用SetWindowWord和SetWindowLong函数,将数据与某个指定窗口关联起来。同样,我们可以用TLS将数据与指定的线程关联起来。例如,获知线程的运行时长。而C/C++库中也实现了这些内容,比如_tcstok_s,asctime...原创 2020-04-19 11:29:21 · 202 阅读 · 0 评论 -
windows系统之Hook实例DIPS
windows系统下Hook文章示例来至《Windows核心编程》第22章实例Desktop Item Position Saver工具原理说明windows下使用Hook实现对远程进程注入DLL技术,通过共用操作系统下同一份DLL,实现对目标进程的特定消息传输,甚至达到控制的技术。首先需要了解的实现DLL注入实现Hook进程的方式HHOOK hHook = SetWindowsHook...原创 2020-04-18 23:52:30 · 397 阅读 · 1 评论 -
windows注入
windows注入本文内容引述至《windows核心编程》注入引入需求:从另一个进程创建的窗口派生子类窗口需要一些方式来辅助调试,比如确定另一个进程正在使用哪些DLL对另一个进程Hook窗口派生User32.dll被映射到进程A的地址空间中,负责对发到和发往进程A的任何窗口的消息进行接收和派发。当User32.dll检测到一个消息的时候,会先确定该窗口的WndProc的地址,然后...原创 2020-04-17 08:49:09 · 355 阅读 · 0 评论 -
windows下DLL基础
动态链接库windows应用程序编程接口(application programming interface,API)所提供的所有函数都包含在DLL中。DLL描述kernal32.dll包含的函数用来管理内存、进程以及线程User32.dll包含的函数用来执行与用户界面相关的任务GDI32.dll包含的函数用来绘制图像和显示文字AdvAPI32.dl...原创 2020-04-16 01:04:41 · 283 阅读 · 0 评论 -
visual C++下全局对象的构建与析构
问题引入引入问题表格何时运行构造函数析构函数EXE中的全局对象??DLL中的全局对象??回答何时运行构造函数析构函数EXE中的全局对象C运行时Startup代码C运行库DLL清理DLL中的全局对象C运行时优先于DllMain的DLL_PROCESS_ATTACH函数C运行时后于DLL_PROCESS_DETACH返...原创 2020-04-15 22:46:11 · 196 阅读 · 0 评论 -
windows内核态线程同步
内核态线程同步以下内容引述《windows核心编程》为什么用内核态同步在用户态下进行线程同步的最大好处就是速度非常快,但是也存在一些局限性,而且不适用于许多应用程序。例如,对interlockd系列函数只能对一个值进行操作,他们从来不会把线程切换到等待状态;使用关键段把线程切换到等待状态,但是他们只能用来对同一个进程中的线程进行同步;在使用关键段的时候我们容易陷入死锁,因为无法为进入关...原创 2020-04-11 14:39:07 · 401 阅读 · 0 评论 -
windows用户模式线程同步
windows用户模式线程同步以下内容引述至《windows核心编程》用户模式,及用户态。原子访问原子访问:一个线程在访问某个资源的同时能够保证没有其他线程会在同一时刻访问同一资源。Interlokced系列函数提供了我们需要的解决方案InterlockedExchangeAdd传一个长整形变量的地址和增量值,函数就会保证递增操作是以原子方式进行。x86上函数维持一个硬件信号,会...原创 2020-04-10 23:00:51 · 246 阅读 · 0 评论 -
windows下线程C/C++运行库
window下C/C++运行库以下内容引述至《windows核心编程》C/C++运行库库名称描述LibCMt.lib库的静态链接发行版本LibCMtD.lib库的静态链接调试版本MSVCRt.lib导入库,用于动态链接MSVCR80.dll库的发行版本(默认)MSVCRtD.lib导入库,用于动态链接MSVCR80D.dll库的调试版本MS...原创 2020-04-09 09:59:00 · 503 阅读 · 0 评论 -
windows线程内幕
windows线程内幕以下内容引述至《windows核心编程》创建和初始化CreateThread函数的一个调用导致系统创建一个线程内核对象。该对象的初始化引用计数为2,(除非线程终止,而且从CreateThread返回的句柄关闭,否则线程内核对象不会被销毁)一旦创建了内核对象,系统就分配内存,提供给线程的堆栈使用。内存是从进程的地址空间内分配的,因为线程没有自己的地址空间。然后,系统将...原创 2020-04-09 09:20:20 · 200 阅读 · 0 评论 -
windows下线程入门
windows线程以下内容引述《windows核心编程》线程与进程进程实际上有两个组成部分:一个进程内核对象和一个地址空间;同样的,线程也有两个组成部分:线程的内核对象,操作系统用它管理线程,系统还用内核对象来存放线程统计信息的地方;线程栈,用于维护线程执行时所需的所有函数参数和局部变量创建线程对于用MSVC编译器生成的应用程序,这个线程首先会执行C/C++运行库的启动代码,后者...原创 2020-04-08 10:00:03 · 133 阅读 · 0 评论 -
protobuf 编译及使用
protobufProtobuf全称是Google Protocol Buffer, 是谷歌公司提供的用于通信的结构化数据存储方式。编译protobuf库由于在编写完protobuf文件后,文件对应产生的.h文件和.cc文件还会依赖protobuf的头文件和库文件,因此需要编译protobuf库。但是protobuf的官方文档写的不够友好,在windows下按照官方文档并不能实际生产出需要...原创 2020-03-27 23:41:42 · 1744 阅读 · 0 评论