<?xml version="1.0" encoding="utf-8" ?><rss version="2.0"><channel><title><![CDATA[WeinKee的博客]]></title><description><![CDATA[]]></description><link>https://blog.youkuaiyun.com/WeinKee</link><language>zh-cn</language><generator>https://blog.youkuaiyun.com/</generator><copyright><![CDATA[Copyright &copy; WeinKee]]></copyright><item><title><![CDATA[c++ 语言技巧之traits]]></title><link>https://blog.youkuaiyun.com/WeinKee/article/details/107192411</link><guid>https://blog.youkuaiyun.com/WeinKee/article/details/107192411</guid><author>WeinKee</author><pubDate>Tue, 07 Jul 2020 23:34:27 +0800</pubDate><description><![CDATA[Traits
Traits技术是STL中比较常见的一种C++语言技巧表达方式之一，通过C++模板的能力，将对象类型萃取出来，让同一个接口实现对应的功能。特别是在算法和容器中，可以解耦出具体的对象类型，使得两者通过迭代器实现链接。
Traits技巧之入门
C++中通过使用迭代器，将STL中的容器和算法相解耦，在C++中编译器编译器需要考虑相应的型别判断。
首先我们通过模板获取形参的数据类型
在这里插入代码片


...]]></description><category></category></item><item><title><![CDATA[Linux下I/O复用模型]]></title><link>https://blog.youkuaiyun.com/WeinKee/article/details/106970281</link><guid>https://blog.youkuaiyun.com/WeinKee/article/details/106970281</guid><author>WeinKee</author><pubDate>Sat, 27 Jun 2020 13:35:15 +0800</pubDate><description><![CDATA[以下内容引述至《Linux/Unix系统编程手册》
整体概览
常见的程序使用的I/O模型都是单个进程每次只在一个文件描述符上执行I/O操作，每次I/O系统调用会阻塞直到完成数据传输。
对于许多应用来说，传统的阻塞式I/O模型已经足够了，但这不代表所有的应用都能得到满足。

如果可能的话，以非阻塞的方式检查文件描述符上是否可进行I/O操作
同时检查多个文件描述符，看它们中的任何一个是否可以执行I/O操作
满足这些技术需求的方案是：
非阻塞式I/O 和 多进程或多线程技术

非阻塞式I/O可以让我们周期性地检查]]></description><category></category></item><item><title><![CDATA[Linux socket 高级主题]]></title><link>https://blog.youkuaiyun.com/WeinKee/article/details/106892965</link><guid>https://blog.youkuaiyun.com/WeinKee/article/details/106892965</guid><author>WeinKee</author><pubDate>Fri, 26 Jun 2020 14:12:22 +0800</pubDate><description><![CDATA[以下内容引述自《Linux/Unix系统编程手册》
流式套接字上的部分读和部分写
如果套接字上可用的数据比在read()调用中请求的数据要少，这种情况下，read()直接返回可用的字节数。
如果没有足够的缓冲区空间来传输所有请求的字节，并且满足了如下的几条中的其中一条时，可能会出现部分写的现象。

在write() 调用中传输了部分请求的字节后被信号处理例程中断；
套接字工作在非阻塞模式下(O_NONBLOCK)，可能当前只能传输一部分请求的字节；
在部分请求的字节已经完成传输后出现了一个异步错误。对于这里]]></description><category></category></item><item><title><![CDATA[Socket: 服务器设计]]></title><link>https://blog.youkuaiyun.com/WeinKee/article/details/106864937</link><guid>https://blog.youkuaiyun.com/WeinKee/article/details/106864937</guid><author>WeinKee</author><pubDate>Sun, 21 Jun 2020 09:23:16 +0800</pubDate><description><![CDATA[以下内容引述至《Linux/Unix系统编程手册》
迭代型和并发型服务器
对于使用Socket的网络服务器程序，有两种常见的设计形式：

迭代型：服务器每次只处理一个客户端，只有当完全处理完一个客户端的请求后采取处理下一个客户端；
并发型：这种类型的服务器被设计为能够同时处理多个客户端的请求

迭代性服务器通常只使用与能够快速处理客户端请求的场景，因为每个客户端都必须先等待，知道前面所有的客户端都处理完了服务器才能继续服务下一个客户端。迭代型服务器的典型应用场景是当客户端和服务器之间交换单个请求和响应时。
]]></description><category></category></item><item><title><![CDATA[Linux Socket Internet Domain]]></title><link>https://blog.youkuaiyun.com/WeinKee/article/details/106699049</link><guid>https://blog.youkuaiyun.com/WeinKee/article/details/106699049</guid><author>WeinKee</author><pubDate>Fri, 19 Jun 2020 09:19:52 +0800</pubDate><description><![CDATA[一下内容引述直《Linux/Unix系统编程手册》
Internet Domain Socket
Internet Domain流socket是基于TCP之上的，他们提供了可靠的双向字节流通信信道。

]]></description><category></category></item><item><title><![CDATA[Linux网络socket: TCP/IP网络基础]]></title><link>https://blog.youkuaiyun.com/WeinKee/article/details/106676104</link><guid>https://blog.youkuaiyun.com/WeinKee/article/details/106676104</guid><author>WeinKee</author><pubDate>Thu, 11 Jun 2020 09:15:10 +0800</pubDate><description><![CDATA[以下内容引述至《Linux/Unix系统编程手册》
互联网协议和层
联网协议通常会被组织成一系列的层，其中每一层都构建与下层之上并提供特性以供上层使用。
ARP：地址解析协议关注的是如何将因特网地址映射到硬件地址
ICMP：用来在网络中传输错误和控制信息（ping和traceroute程序使用），主机和路由器使用因特网组管理协议来支持IP数据报的多播
封装
封装是分层联网协议中的一个重要的原则。封装中的概念是低层会将从高层向低层传递的信息当成不透明的数据来处理。换言之，低层不会尝试对高层发送过来的信息进行解]]></description><category></category></item><item><title><![CDATA[Linux Socket Unix Domain介绍]]></title><link>https://blog.youkuaiyun.com/WeinKee/article/details/106658572</link><guid>https://blog.youkuaiyun.com/WeinKee/article/details/106658572</guid><author>WeinKee</author><pubDate>Wed, 10 Jun 2020 21:41:49 +0800</pubDate><description><![CDATA[以下内容引述至《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]]></description><category></category></item><item><title><![CDATA[Linux下socket入门介绍]]></title><link>https://blog.youkuaiyun.com/WeinKee/article/details/106634027</link><guid>https://blog.youkuaiyun.com/WeinKee/article/details/106634027</guid><author>WeinKee</author><pubDate>Wed, 10 Jun 2020 00:11:25 +0800</pubDate><description><![CDATA[以下内容引述至《Linux/Unix系统编程手册》
概述
应用程序使用socket进行通信的方式如下

各个应用程序创建一个socket，socket是一个允许通信的“设备”，两个应用程序都需要用到它；
服务器将自己的socket绑定到一个总所周知的地址上使得客户端能够定位到它的位置
使用socket系统调用能够创建一个socket，它返回一个用来在后续系统调用中引用该socket的文件描述符

fd = socket(domain, type, protocol);

通信domain
socket存在于]]></description><category></category></item><item><title><![CDATA[Linux静态库与动态库简介]]></title><link>https://blog.youkuaiyun.com/WeinKee/article/details/106438663</link><guid>https://blog.youkuaiyun.com/WeinKee/article/details/106438663</guid><author>WeinKee</author><pubDate>Sun, 31 May 2020 11:49:35 +0800</pubDate><description><![CDATA[以下内容引述至《Linux/Unix系统编程手册》
静态库
静态库被称为归档文件，它是Unix系统提供的第一种库。静态库能带来以下好处：

可以将一组经常被用到的目标文件组织进单个库文件，这样就可以使用它来构建多个可执行程序并且在构建各个应用程序的时候无需重新编译原来的源代码文件；
链接命令变得更加简单。在链接命令行中只需要指定静态库的名称即可，而无需一个个地列出目标文件了。链接器知道如何搜索静态库并将可执行程序需要的对象抽取出来

从结果上看，静态库实际上就是一个保存所有被添加到其中的目标文件的副本的文件]]></description><category></category></item><item><title><![CDATA[Linux进程间通信初入]]></title><link>https://blog.youkuaiyun.com/WeinKee/article/details/106393100</link><guid>https://blog.youkuaiyun.com/WeinKee/article/details/106393100</guid><author>WeinKee</author><pubDate>Thu, 28 May 2020 09:22:14 +0800</pubDate><description><![CDATA[以下内容引述至《Linux/Unix系统编程手册》
IPC工具分类
Unix系统上各种通信和同步工具，根据功能可以分为三类：

通信： 这些工具关注进程之间的数据交换
同步：这些进程关注进程和线程操作之间的同步
信号：在特定场景下仍然可以作为一种同步技术

数据传输

字节流：通过管道、FIFO以及数据报socket交换的数据是一个无分隔符的字节流；每个读取操作可能会从IPC工具中读取任意数量的字节，不管写者写入的块的大小是什么
消息：通过System V消息队列、POSIX消息队列以及数据报socket交]]></description><category></category></item><item><title><![CDATA[Linux线程更多细节]]></title><link>https://blog.youkuaiyun.com/WeinKee/article/details/106372148</link><guid>https://blog.youkuaiyun.com/WeinKee/article/details/106372148</guid><author>WeinKee</author><pubDate>Wed, 27 May 2020 09:15:15 +0800</pubDate><description><![CDATA[以下内容引述至《Linux/Unix系统编程手册》
线程栈
创建线程时，每个线程都有一个属于自己的线程栈，且大小固定，除主线程外的所有线程，其栈的缺省大小均为2MB，也可以调用pthread_attr_setstack()设置线程属性决定线程站的大小。
线程和信号
Unix信号模型是基于Unix进程模型而设计的，问世比Pthread要早几十年。所以信号与线程模型之间存在一些明显的冲突。主要是因为一方面，针对单线程进程要保持传统的信号语义，于此同时，又需要开发出使用与多线程进程环境的新信号模型。
Unix信号]]></description><category></category></item><item><title><![CDATA[Linux线程安全和线程存储]]></title><link>https://blog.youkuaiyun.com/WeinKee/article/details/106348280</link><guid>https://blog.youkuaiyun.com/WeinKee/article/details/106348280</guid><author>WeinKee</author><pubDate>Wed, 27 May 2020 00:07:07 +0800</pubDate><description><![CDATA[以下内容引述至《Linux/Unix系统编程手册》
可重入性
若函数可同时供多个线程安全调用，则称之为线程安全函数；反之，如果函数不是线程安全的，则不能并发调用。
实现线程安全有多种方式。其一是将函数与互斥量关联使用，在调用函数时将其锁定，在函数返回时解锁，对函数的访问是串行的；另一种方式是将共享变量与互斥量关联起来。
可重入函数无需使用互斥量即可实现线程安全。
线程特有数据
实现函数线程安全最为有效的方式就是使其可重入。
要使用线程特有数据，库函数执行的一般步骤如下：

函数创建一个键（key），用以将不]]></description><category></category></item><item><title><![CDATA[Linux线程同步基础]]></title><link>https://blog.youkuaiyun.com/WeinKee/article/details/106344807</link><guid>https://blog.youkuaiyun.com/WeinKee/article/details/106344807</guid><author>WeinKee</author><pubDate>Tue, 26 May 2020 00:00:13 +0800</pubDate><description><![CDATA[以下内容引述至《Linux/Unix系统编程手册》
线程同步方式
互斥量 和 条件变量
互斥量
一般情况下，对每一共享资源（可能由多个先关变量组成）会使用不同的互斥量，每一个线程在访问同一资源时将采用如下协议

针对共享资源锁定互斥量
访问共享资源
对互斥量解锁

#include &lt;pthread.h&gt;
int pthread_mutex_lock(pthread_mutex *mutex);
int pthread_mutex_unlock(pthread_mutex *mutex);
in]]></description><category></category></item><item><title><![CDATA[Linux线程初步介绍]]></title><link>https://blog.youkuaiyun.com/WeinKee/article/details/106308400</link><guid>https://blog.youkuaiyun.com/WeinKee/article/details/106308400</guid><author>WeinKee</author><pubDate>Mon, 25 May 2020 23:08:20 +0800</pubDate><description><![CDATA[以下内容引述至《Linux/Unix系统编程手册》
线程
Pthread API 定义了一干数据类型




数据类型
描述




pthread_t
线程ID


pthread_mutex_t
互斥对象


pthread_mutexattr_t
互斥属性对象


pthread_cond_t
条件变量



]]></description><category></category></item><item><title><![CDATA[Linux进程创建&终止&等待&执行]]></title><link>https://blog.youkuaiyun.com/WeinKee/article/details/106226014</link><guid>https://blog.youkuaiyun.com/WeinKee/article/details/106226014</guid><author>WeinKee</author><pubDate>Fri, 22 May 2020 08:15:58 +0800</pubDate><description><![CDATA[以下内容引述《Linux/Unix系统编程手册》
fork、exit、wait、execve
fork()
系统调用fork允许父进程创建子进程，子进程获取父进程的栈、数据段、堆和执行文本段的拷贝
子进程会获得父进程所有的文件描述符的副本。这些副本的创建方式类似于dup()，这也意味着父、子进程中对应的描述符均指向相同的打开文件句柄。
内存语义：


内核将每一进程的代码段标记为只读，从而使进程无法修改自身代码。系统调用fork为子进程创建代码段时，其所构建的一系列进程级页表项均指向与父进程相同的物理内存页]]></description><category></category></item><item><title><![CDATA[Linux信号处理函数详解]]></title><link>https://blog.youkuaiyun.com/WeinKee/article/details/106112175</link><guid>https://blog.youkuaiyun.com/WeinKee/article/details/106112175</guid><author>WeinKee</author><pubDate>Fri, 15 May 2020 08:55:16 +0800</pubDate><description><![CDATA[一下内容引述《Linux/Unix系统编程详解》
设计信号处理函数
信号处理函数设计得越简单越好，这样降低引发竞争条件的风险。
两种常见设计

信号处理函数设置全局性标志变量并退出，主程序对此标记进行周期性检查，一旦置位随机采取相应动作；
信号处理器函数执行某种类型的清理动作，接着终止进程或者使用非本地跳转将栈解开并将控制返回到主程序中的预定位置；

可重入函数与异步信号安全函数
可重入函数
首先区分单线程程序和多线程程序。典型的UNIX程序都具有一条执行线程，贯穿程序始终，CPU围绕单条执行逻辑来处理指令]]></description><category></category></item><item><title><![CDATA[Unix/Linux系统信号详解-初入信号概念]]></title><link>https://blog.youkuaiyun.com/WeinKee/article/details/106068640</link><guid>https://blog.youkuaiyun.com/WeinKee/article/details/106068640</guid><author>WeinKee</author><pubDate>Wed, 13 May 2020 09:36:05 +0800</pubDate><description><![CDATA[以下内容引述《Linux/Unix系统编程手册》
信号
信号是事件发生时对进程的通知机制。
有时也成为软件中断。信号与硬件中断的相似之处在于打断了程序执行的正常流程。
发往进程的诸多内核，通常都是源于内核。
引发内核为进程产生信号的各类事件如下：

硬件发生异常，即硬件检测到一个错误条件并通知内核，随即再由内核发送相应信号给相关进程；
用户键入了能够产生信号的终端特殊字符；
发生了软件事件，比如调整了中断窗口大小，定时器到期，进程执行CPU事件超限等

针对每个信号，都定义了一个唯一的整数，从1开始顺序展开]]></description><category></category></item><item><title><![CDATA[Linux内存分配]]></title><link>https://blog.youkuaiyun.com/WeinKee/article/details/105988485</link><guid>https://blog.youkuaiyun.com/WeinKee/article/details/105988485</guid><author>WeinKee</author><pubDate>Sun, 10 May 2020 12:51:22 +0800</pubDate><description><![CDATA[以下内容引述《Linux/Unix系统编程手册》
堆上分配内存
进程可以增加堆的大小来分配内存，所谓堆是一段长度可变的连续虚拟内存，始于进程的未初始化数据段末尾，随着内存的分配和释放而增减。通常将堆的当前内存边界称为"program break"
调整program break
改变堆的大小，就像命令内核改变进程的program break位置一样。最初，program break正好位于未初始化数据段末尾之后。
在程序加载program break位置之后，内核会在进程试图访问这些虚拟内存地址时自动分配新]]></description><category></category></item><item><title><![CDATA[Linux进程]]></title><link>https://blog.youkuaiyun.com/WeinKee/article/details/105984845</link><guid>https://blog.youkuaiyun.com/WeinKee/article/details/105984845</guid><author>WeinKee</author><pubDate>Fri, 08 May 2020 08:24:39 +0800</pubDate><description><![CDATA[以下内容引述《Linux/Unix系统编程手册》
进程
程序是包含了一系列信息的文件，这些信息描述了如何在运行时创建一个进程

二进制格式标志：每个程序文件都包含用于描述可执行文件格式的元信息，内核用此信息来解释文件中的其他信息；
机器语言指令：对程序算法进行编码；
程序入口地址：标志程序开始执行时的起始指令位置；
数据：程序文件包含的变量初始值和程序使用的字面常量值；
符号表以及重定位表：描述程...]]></description><category></category></item><item><title><![CDATA[Unix/Linux系统编程概念]]></title><link>https://blog.youkuaiyun.com/WeinKee/article/details/105889425</link><guid>https://blog.youkuaiyun.com/WeinKee/article/details/105889425</guid><author>WeinKee</author><pubDate>Sun, 03 May 2020 00:05:21 +0800</pubDate><description><![CDATA[以下内容引述&lt;Unix/Linux系统编程手册&gt;
系统调用
系统调用是受控的内核入口，进程可以请求内核以自己的名义去执行具体动作。

系统调用将处理器从用户态切换为核心态，以便CPU访问受保护的内核内存；
系统调用的组成是固定的，每个系统调用都是由一个唯一的数字来标志；
每个系统调用可辅以一套参数，对用户空间（进程虚拟地址空间）与内核空间之间（相互）传递的信息加以规范

系统调用步骤
...]]></description><category></category></item></channel></rss>